Domanda

Se sto spiegando la seguente caratteristica foreach a qualcuno, è accurato dire che # 2 è l'approccio " Linq Forech " o è semplicemente un metodo di estensione " List<T> "Non è ufficialmente associato a LINQ?

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()));
.

È stato utile?

Soluzione

È un metodo normale di List<T> anche se le persone spesso forniscono loroMetodi di estensione propria per altri IEnumerable<T>. LINQ non fornisce un'estensione foreach A causa dei suoi obiettivi di progettazione di essere funzionali / lavorando con tipi immutabili, foreach è un funzionamento intrinsecamente laterale / imperativo.

Altri suggerimenti

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

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

(E se volevi essere davvero nitpicky, allora ForEach non fa parte della lingua C #: fa parte della libreria di classe base .NET.)

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

Quindi non ha nulla a che fare con Linq.Se lo fosse, la distinzione tra "ufficialmente associata a LINQ" e non ufficialmente associata a LINQ non è praticamente molto utile.LINQ è semplicemente un grappolo di metodi di estensione incatenati (spesso su IEnumerable<T>).C'è raramente qualsiasi punto nel distinguerlo da altri metodi di estensione su IEnumerable<T>.La migliore distinzione sarebbe che risiedono in uno degli spazi dei nomi System.Linq o System.Something.Linq.

Non è LINQ.Uno degli aspetti di progettazione di LINQ è che i metodi LINQ standard non hanno effetti collaterali.Il metodo Foreach viola questo.

Eric Lippert ha un articolo del blog tutto su questo:

http:// blog.msdn.com / b / ericlippert / archivio / 2009 / 05/18 / foreach-vs-foreach.aspx

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

Leggiamolo:

    .
  • ToList è una chiamata a System.Linq.Enumerable.ToList() introdotta in .NET Framework 3.5
  • ForEach è una chiamata a System.Collections.Generic.List<T>.ForEach introdotta in .NET Framework 2.0
  • c => è la sintassi dell'espressione Lambda introdotta in c # 3.0.

Se guardi la documentazione per List<T>.ForEach , puoiVedere la vecchia sintassi Delegata che è stata richiesta quindi per chiamarlo.

La fianco di effetti laterale sarà (è) fornita nelle estensioni LINQ di Visual Studio 2010.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top