2010-07-19 20 views
9

Se sto spiegando la seguente funzione ForEach a qualcuno, è esso esatto dire che 2 # è il "metodo foreach LINQ" o è semplicemente un "List<T> metodo di estensione" che non è ufficialmente associata con LINQ ?Quale parte del linguaggio C# è .ForEach()?

var youngCustomers = from c in customers 
        where c.Age < 30 
        select c; 

//1. traditional foreach approach 
foreach (var c in youngCustomers) 
{ 
    Console.WriteLine(c.Display()); 
} 

//2. LINQ foreach approach? 
youngCustomers.ToList().ForEach(c => Console.WriteLine(c.Display())); 
+3

Controlla questo post da Eric Lippert http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx –

+1

Vale la pena notare che il tuo n. 2 scorrerà attraverso il elementi due volte: una volta per creare l'elenco e una volta per il metodo ForEach.Se si desidera utilizzare tale stile di codice, che è perfettamente legittimo, è meglio scrivere il proprio metodo di estensione ForEach su IEnumerable. –

risposta

24

it is a normal method of List<T> se la gente spesso forniscono i propri metodi di estensione per altri IEnumerable<T>. LINQ does not provide a ForEach extension a causa dei suoi obiettivi di progettazione di essere funzionale/lavorare con tipi immutabili, ForEach è un intrinseco effetto collaterale/operazione imperativa.

+0

questo è quello che sospettavo ma non ero sicuro dato che se fai una ricerca su google per "linq foreach" sembra essere ampiamente ritenuto errato che .ForEach() sia una caratteristica di LINQ –

10

Non ha nulla a che fare con LINQ e non è un metodo di estensione.

ForEach è un semplice metodo di istanza sulla classe List<T>.

(e se si voleva essere davvero pignoli, quindi ForEach non è parte del linguaggio C# a tutti: è parte della libreria di classi .NET Base.)

+0

Base Class Library (BCL) aka Framework Class Library (FCL) – abatishchev

+0

@abatishchev: La mia comprensione è che BCL e FCL non sono sinonimi. La FCL è un superset del BCL. Vedi http://en.wikipedia.org/wiki/Base_Class_Library e http://en.wikipedia.org/wiki/Framework_Class_Library. – LukeH

+0

Sì, li ho visti entrambi. Penso che questi due articoli siano alquanto indistinti. Non so perché Microsoft non li abbia ancora modificati. Come risulta dagli articoli, BCL contiene solo spazi dei nomi standardizzati ECMA nel frattempo FCL - tutti gli spazi dei nomi standard. Destra? – abatishchev

2

Non è un metodo di estensione di List<T>, è un metodo regolare di List<T>.

Quindi non ha nulla a che fare con LINQ. Se così fosse, la distinzione tra "ufficialmente associato a LINQ" e non ufficialmente associata a LINQ non è praticamente molto utile. LINQ è semplicemente un insieme di metodi di estensione concatenati (spesso su IEnumerable<T>). Raramente si distingue da altri metodi di estensione su IEnumerable<T>. La distinzione migliore sarebbe che risiedono in uno degli spazi dei nomi System.Linq o System.Something.Linq.

1
youngCustomers.ToList().ForEach(c => Console.WriteLine(c.Display())); 

Diciamo scomposizione:

  • ToList è una chiamata a System.Linq.Enumerable.ToList() introdotto in .NET framework 3.5
  • ForEach è una chiamata a System.Collections.Generic.List<T>.ForEach introdotta in .net framework 2.0
  • c => è la sintassi di espressione lambda introdotta in C# 3.0.

Se si consulta la documentazione di List<T>.ForEach, è possibile visualizzare la vecchia sintassi del delegato richiesta per richiamarla.

0

L'effetto side foreach sarà (è) fornito nelle estensioni Linq di Visual Studio 2010.