Sé que IEnumerable se ha debatido varias veces aquí, pero no he podido encontrar la respuesta a mi pregunta específica, por lo que lo planteo como una nueva pregunta.Enumeración múltiple de IEnumerable
Considere el siguiente fragmento de código:
static void Main(string[] args)
{
List<string> testList = new List<string> {"Test", "Test1", "Test1"};
IEnumerable<string> filtered = testList.Where(x => x == "Test1");
DoSomeWork(filtered);
DoSomeMoreWork(filtered);
}
public static void DoSomeWork(IEnumerable<string> items)
{
foreach (var item in items)
{
Console.WriteLine("do some work");
}
}
public static void DoSomeMoreWork(IEnumerable<string> items)
{
foreach (var item in items)
{
Console.WriteLine("do some more work");
}
}
Estoy en lo cierto, esto provoca que no sólo las dos opciones de "filtrado" a iterar dos veces, pero en realidad los artículos en "LISTAPRUEBA"? Entonces, teniendo en cuenta que "testList" era una gran lista con 10000 ítems y "filtrado" lo reduce a 10 ítems, sería más inteligente hacer una lista "filtrada" (también conocida como var y anexar ToList() al final)
EDITAR: Esa es la pregunta más embarazosa que he hecho aquí. Sabía que sería malo iterar un IQueryable, por ejemplo, porque esto daría como resultado la obtención de los datos dos veces desde el DB. Sin embargo, no estaba exactamente seguro acerca de las listas de memoria. Me gustaría borrar la pregunta si podía ;-)
Lista
Sí, lo sé. Pero la pregunta es.Will DoSomeWork() y DoSomeMoreWork() causan la iteración de la lista grande o solo iterarán en el subconjunto. – Christoph
@Christoph - la respuesta está editada ahora ..... –
Es mejor utilizar .ToArray que ToList para este uso: las matrices son algo más eficientes, pero lo más importante es que no permiten agregar/eliminar, evitando la flexibilidad innecesaria (evitando la confusión) y errores). –