Si utilizas c# quizás deberías implementar el uso de LINQ para el manejo de colecciones
Es una herramienta para estandarizar la forma en que trabajas con los datos sin importar el origen, puede ser SQL, XML, etc.
Mediante LINQ puedes realizar los distintos tipos de consultas, como seleccionar filtrar, ordenar, unir,agrupar.
Una de las ventajas es que puedes evitar utilizar un bucle para obtener la información que necesitas.
Por ejemplo: Para obtener los valores de un array mayores a 80, sin LINQ lo podemos hacer de la siguiente manera:
int[] scores = [97, 92, 81, 60];
List<int> above80 = [];
foreach (var item in scores)
{
if (item > 80)
above80.Add(item);
}
foreach (var item in above80)
{
Console.Write(item + " ");
}
Implementado LINQ
int[] scores = [97, 92, 81, 60];
IEnumerable<int> above80 =
from score in scores
where score > 80
select score;
foreach (var i in above80)
{
Console.Write(i + " ");
}
Lo que estamos haciendo es:
score in scores
where score > 80
select score
Con esto ya tenemos los elementos que necesitamos en nuestra variable above80
Tienes dos opciones para escribir consultas de LINQ, la primera es la que vimos en el ejemplo de arriba, es una sintaxis que es similar a escribir una consulta SQL. La segunda opción es utilizar la sintaxis de métodos,esta se apoya del uso de expresiones lambda(por ejemplo en un Where(x=> filtro) utilizas una función anónima para filtrar según lo que necesites). Puedes realizar las mismas operaciones con ambas sintaxis, la elección queda a preferencia del desarrollador
algunas personas dicen que para joins complejos les es mejor utilizar la sintaxis de consulta
int[] scores = [97, 92, 81, 60];
IEnumerable<int> above80Query =
from score in scores
where score > 80
select score;
IEnumerable<int> above80Method = scores.Where(x => x > 80);
Algo a tomar en consideración es que las consultas de de LINQ tienen una ejecución diferida, es decir la consulta no se realiza hasta que utilicemos el resultado. En la documentación de Microsoft se especifica que esto se realiza de esa forma para mejorar el rendimiento cuando se trabaje con colecciones grandes.
Por ejemplo:
int[] scores = [97, 92, 81, 60];
IEnumerable<int> above80 = scores.Where(x => x > 80);
Console.WriteLine("Count" + above80.Count()); // Muestra 3
scores[1] = 50;
//Solo muestra 97 y 81
foreach (var i in above80)
{
Console.Write(i + " ");
}
Consultamos los scores mayores a 80 (que serian 97, 92, 81) y son los valores que están en nuestra variable above80
Pero si realizamos un cambio antes de solicitar el resultado de la consulta
scores[1] = 50;
Nuestro resultado final se vera afectado puesto que en ese momento es en el que se ejecuta la consulta
//Solo muestra 97 y 81
foreach (var i in above80)
{
Console.Write(i + " ");
}