Quelle partie du langage C# est .ForEach()?
-
17-09-2020 - |
Question
Si je suis en expliquant les points suivants ForEach fonction à quelqu'un, est-il exact de dire que le #2 est le "LINQ foreach approche"ou est-ce simplement un "List<T>
méthode d'extension"qui n'est pas officiellement associé avec 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()));
La solution
c'est une méthode normale de List<T>
bien souvent, les gens fournissent leurs propres méthodes d'extension pour les autres IEnumerable<T>
. LINQ ne fournit pas un ForEach extension en raison de ses objectifs de conception de l'être fonctionnel/ travailler avec immuables types, ForEach est en soi un effet de bord/impératif de l'opération.
Autres conseils
Il n'est pas une extension de la méthode de List<T>
, c'est une méthode régulière de List<T>
.
Donc, il n'a rien à voir avec LINQ.Si elle avait, la distinction entre "officiellement associé avec LINQ" et n'est pas officiellement associé avec LINQ n'est pratiquement pas très utile.LINQ est tout simplement un tas de enchaînés les méthodes d'extension (souvent sur IEnumerable<T>
).Il est rarement n'importe quel point dans le distinguant d'autres méthodes d'extension sur IEnumerable<T>
.La meilleure distinction serait qu'ils résident dans l'un des System.Linq
ou System.Something.Linq
les espaces de noms.
Ce n'est pas LINQ.L'un des aspects de la conception de LINQ est que la norme LINQ méthodes n'ont pas d'effets secondaires.La méthode ForEach serait en violation de cette.
Eric Lippert a un article du blog de tout cela:
http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx
youngCustomers.ToList().ForEach(c => Console.WriteLine(c.Display()));
Nous allons le décomposer:
ToList
est un appel à l'System.Linq.Enumerable.ToList()
introduit en .net framework 3.5ForEach
est un appel à l'System.Collections.Generic.List<T>.ForEach
introduit en .net framework 2.0c =>
est lambda la syntaxe de l'expression introduite en c# 3.0.
Si vous regardez la documentation de List<T>.ForEach
, vous pouvez voir l'ancien délégué de la syntaxe qui était nécessaire de revenir ensuite à l'appeler.
Côte-d'effectuer foreach sera ( est ) fourni dans Visual Studio 2010 extensions Linq.