2014-09-05 13 views
5

Questa istruzione linq verrà eseguita ogni volta in ogni ciclo? In qualche modo il ciclo for memorizza il risultato di linq?Linq in Per Loop

for(int i = 0; i < mylist.Where(x => x > 10).ToList().Count; i++) 

Siamo spiacenti, in caso di un duplicato

+1

Esiste un metodo 'Count' incorporato -' mylist.Count (x => x> 10) '. –

+1

In ogni caso, la condizione verrà eseguita più volte = problema di prestazioni. –

+0

verrà eseguito il metodo di conteggio incorporato su ogni ciclo? –

risposta

4

ho eseguito il seguente codice nel LINQPad:

for(int i = 0; i < 10.Dump(); i++) 
{ 
} 

Il risultato è stato:

enter image description here

Quindi, penso che il la risposta è sì, verrà eseguita più volte.

+0

Un approccio interessante, ma si rivela poco di fatto. Immaginate se il metodo 'Where' fosse simile (lo so non lo è, ma ancora):' IEnumerable pubblico Dove source, Predicato condizione {if (giàCalcolato) restituisce giàComputedArray;/* calcoli complessi */già Calcolato = vero; } ' – decPL

+0

@decPL Pensi che non valuterà ogni volta in questo caso? La domanda era se il codice sarebbe stato eseguito ogni volta. –

+0

No, la domanda era se l'istruzione LINQ è stata eseguita. Direi che se LINQ funzionasse in modo diverso (cioè fosse in qualche modo precompilato), non ci sarebbe stata alcuna esecuzione LINQ. – decPL

3

Sì che avrebbe funzionato, ma vorrei suggerire di provare meglio conservarlo in un variabile int

int k = mylist.Where(x => x > 10).ToList().Count; 
for(int i = 0; i < k; i++) 

Questo rende più leggibile

+0

Cosa succede se modifica la lista, e dopo ogni iterazione vuole controllare il conteggio? –

+2

Meglio usare 'Enumerable.Count' se non è necessario l'elenco. 'int count = mylist.Count (x => x> 10)'. Vale anche la pena ricordare che 'foreach' non lo esegue ad ogni iterazione. –

+2

@ La condizione di NovitchiS dovrebbe essere costante (IMHO) - Penso che sia una cattiva abitudine modificare la condizione nel ciclo 'for' per quanto riguarda la variabile.Se vorrebbe modificare la collezione, penso che il ciclo sarebbe una soluzione migliore. –

3

È inoltre possibile utilizzare questo:

mylist.Where(x => x > 10) 
     .Select((x,index) => ExecuteYourFunction(x, index)); 

Oppure se il metodo non ha alcun valore di ritorno:

mylist.Where(x => x > 10) 
     .Select((x,index) => new { Index = index, Value= x }) 
     .ToList() 
     .Foreach(myType => ExecuteYourFunction(myType.Name, myType.Index)); 
+1

Probabilmente non dovrei commentare, dato che sono il primo a saltare l'if-it-can-be-done-in-LINQ-do-it! pistola, ma questo non è più leggibile (e questo proviene da un fanatico di LINQ), né funziona meglio. – decPL

+0

Ha anche inutile 'ToList's nel mezzo di esso. E il primo non esegue nulla finché non lo si itera. – Rawling

+0

@Rawling Grazie, rimosso in entrambi i casi. –