2011-11-02 10 views
5

Let dire che hoSeleziona seguito da Dove compaiono due iterazioni su IEnumerable?

IEnumerable<int> list = new int[] { 1, 2, 3 }; 
List<int> filtered = list.Select(item => item * 10).Where(item => item < 20).ToList(); 

La domanda è: ci sono due iterazioni o solo uno.

In altre parole, è che equivalente in prestazioni:

IEnumerable<int> list = new int[] { 1, 2, 3 }; 
List<int> filtered = new List<int>(); 
foreach(int item in list) { 
    int newItem = item * 10; 
    if(newItem < 20) 
     filtered.Add(newItem); 
} 

risposta

7

C'è una singola iterazione sulla raccolta eseguita quando si chiama il metodo .ToArray modo entrambi dovrebbero essere equivalenti. .Select è una proiezione e .Where è un filtro, entrambi espressi come alberi di espressione nel set di dati originale.

potrebbe essere facilmente provato:

public class Foo: IEnumerable<int> 
{ 
    public IEnumerator<int> GetEnumerator() 
    { 
     yield return 1; 
     Console.WriteLine("we are at element 1"); 
     yield return 2; 
     Console.WriteLine("we are at element 2"); 
     yield return 3; 
     Console.WriteLine("we are at element 3"); 
    } 

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() 
    { 
     throw new NotImplementedException(); 
    } 
} 

class Program 
{ 
    static void Main() 
    { 
     var filtered = new Foo() 
      .Select(item => item * 10) 
      .Where(item => item < 20) 
      .ToList(); 
    } 
} 

quando le stampe eseguite il seguente:

we are at element 1 
we are at element 2 
we are at element 3 
+0

Un piccolo nitpick: la domanda è contrassegnata da "linq-to-objects", quindi non ci sono alberi di espressione coinvolti, solo l'iterazione diretta attraverso la sequenza insieme alle chiamate dei delegati. – LukeH

2

In LINQ to Objects WHERE e selezionare Non iterare il enumerabile. Il codice chiamante lo enumera quando esegue una foreach sulla query o ToList o ToArray(), ecc.

In Linq a SQL non c'è iterazione come mai. Quando si esegue ToList o ToArray() la query viene eseguita dal database. A seconda del tipo di query, db può cercare gli indici o eseguire una scansione della tabella.

Problemi correlati