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()));
Était-ce utile?

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'a rien à voir avec LINQ et ce n'est pas une méthode d'extension.

ForEach est une simple méthode d'instance sur le List<T> classe.

(Et si vous voulez être vraiment pinailleurs, puis ForEach ne fait pas partie du langage C# à tous:il fait partie de la .NET de la Bibliothèque de classes de Base.)

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.5
  • ForEach est un appel à l' System.Collections.Generic.List<T>.ForEach introduit en .net framework 2.0
  • c => 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top