Pregunta

Si me estoy explicando el siguiente ForEach característica a alguien, es preciso decir que el #2 es el "LINQ foreach enfoque"o es simplemente un "List<T> método de extensión"que no es oficialmente asociado con 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()));
¿Fue útil?

Solución

es un método normal de List<T> aunque la gente a menudo proporcionan sus propios métodos de extensión para otros IEnumerable<T>. LINQ no proporciona un ForEach de extensión debido a su diseño de metas de ser funcional/ trabajo con inmutable tipos, ForEach es intrínsecamente un efecto secundario/imperativo de la operación.

Otros consejos

No tiene nada que ver con LINQ y no es un método de extensión.

ForEach es un simple método de instancia en el List<T> clase.

(Y si usted quiere ser realmente nitpicky, entonces ForEach no es parte del lenguaje C# en todo:es parte de el .NET Biblioteca de clases Base.)

No es un método de extensión de List<T>, es un método regular de List<T>.

Así que no tiene nada que ver con LINQ.Si lo hubiera hecho, la distinción entre "oficialmente asociado con LINQ" y no oficialmente asociado con LINQ no es prácticamente muy útil.LINQ es simplemente un puñado de encadenado métodos de extensión (a menudo en IEnumerable<T>).Rara vez hay algún punto en que la distingue de otros métodos de extensión en IEnumerable<T>.La mejor distinción sería que residen en uno de los System.Linq o System.Something.Linq los espacios de nombres.

No LINQ.Uno de los aspectos de diseño de LINQ es que el estándar de LINQ métodos no tienen efectos secundarios.El método ForEach violaría este.

Eric Lippert tiene un artículo en el blog todo sobre esto:

http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx

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

Vamos a desglosarlo:

  • ToList es una llamada a la System.Linq.Enumerable.ToList() introducido en .net framework 3.5
  • ForEach es una llamada a la System.Collections.Generic.List<T>.ForEach introducido en .net framework 2.0
  • c => es la sintaxis de expresiones lambda introdujo en c# 3.0.

Si usted mira la documentación de List<T>.ForEach, usted puede ver el antiguo delegado de la sintaxis que se requiere para llamarlo.

Efectos secundarios foreach será ( es ) que proporciona Visual Studio 2010 Linq de las extensiones.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top