Quale parte della lingua C # è .Fieard ()?
-
17-09-2020 - |
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()));
. 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 è 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 aSystem.Linq.Enumerable.ToList()
introdotta in .NET Framework 3.5 -
ForEach
è una chiamata aSystem.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.