So che IEnumerable è stato discusso più volte qui, ma non sono riuscito a trovare la risposta alla mia domanda specifica, quindi lo presenterò come una nuova domanda.Enumerazione multipla di IEnumerable
Si consideri il seguente frammento di codice:
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");
}
}
ho ragione, che questo provoca non solo i due elementi in "filtrati" per iterare due volte, ma in realtà le voci in "LISTA-TEST"? Quindi, considerando che "testList" era una grande lista con 10000 elementi e "filtrato" lo riduce a 10 elementi, sarebbe più intelligente fare "filtrare" un elenco (alias use var e aggiungere append ToList() alla fine)
MODIFICA: Questa è la domanda più imbarazzante che abbia mai posto qui. Sapevo che sarebbe stato male iterare un IQueryable, ad esempio perché ciò avrebbe comportato il recupero dei dati due volte dal DB. Tuttavia non ero esattamente sicuro sulle liste di memoria. Vorrei cancellare la domanda se potessi ;-)
Sì, lo so. Ma la domanda è.DoSomeWork() e DoSomeMoreWork() causeranno entrambi iterando la lista grande o faranno solo un'iterazione del sottoinsieme. – Christoph
@Christoph - la risposta è ora modificata ..... –
Meglio usare. ToArray che ToList per questo uso: gli array sono un po 'più efficienti, ma soprattutto non consentono l'aggiunta/rimozione, evitando una flessibilità non necessaria (evitando così confusione e bug). –