2010-07-19 19 views
9

Si estoy explicando la siguiente característica ParaCada a alguien, ¿es correcto decir que # 2 es el "enfoque foreach LINQ" o es simplemente un "List<T> método de extensión" que no está asociada oficialmente con LINQ ?¿Qué parte del lenguaje C# es .ForEach()?

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())); 
+3

Revise esta publicación de Eric Lippert http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx –

+1

Vale la pena señalar que su # 2 recorrerá el artículos dos veces: una para crear la lista y una para el método ForEach.Si desea utilizar ese estilo de código, que es perfectamente legítimo, es mejor que escriba su propio método de extensión ForEach en IEnumerable. –

Respuesta

24

it is a normal method of List<T> aunque la gente a menudo proporcionan sus propios métodos de extensión para otra IEnumerable<T>. LINQ does not provide a ForEach extension debido a sus objetivos de diseño de ser funcional/trabajar con tipos inmutables, ForEach es una operación inherente de efecto secundario/imperativa.

+0

esto es lo que sospechaba, pero no estaba seguro ya que si haces una búsqueda en google de "linq foreach" parece ser una creencia generalizada que .ForEach() es una característica de LINQ –

10

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

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

(Y si usted quiere ser muy quisquillosa, a continuación, ForEach no es parte del lenguaje C# en absoluto: es parte de la biblioteca de clases de .NET Base.)

+0

Base Class Library (BCL) aka Framework Class Library (FCL) – abatishchev

+0

@abatishchev: Mi comprensión es que BCL y FCL no son sinónimos. FCL es un superconjunto del BCL. Ver http://en.wikipedia.org/wiki/Base_Class_Library y http://en.wikipedia.org/wiki/Framework_Class_Library. – LukeH

+0

Sí, los vi a los dos. Creo que estos dos artículos son algo indistintos. No sé por qué Microsoft no los editó aún. Como se deduce de los artículos, BCL contiene solo espacios de nombres estandarizados ECMA mientras tanto FCL - todos los espacios de nombres estándar. ¿Derecha? – abatishchev

2

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

Por lo tanto, no tiene nada que ver con LINQ. Si lo hubiera hecho, la distinción entre "oficialmente asociado con LINQ" y no asociado oficialmente con LINQ no es prácticamente una muy útil. LINQ es simplemente un montón de métodos de extensión encadenados (a menudo en IEnumerable<T>). Rara vez tiene sentido distinguirlo de otros métodos de extensión en IEnumerable<T>. La mejor distinción sería que residen en uno de los espacios de nombres System.Linq o System.Something.Linq.

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

Vamos a desglosarlo:

  • ToList es una llamada a System.Linq.Enumerable.ToList() introducido en .NET Framework 3.5
  • ForEach es una llamada a System.Collections.Generic.List<T>.ForEach introducida en .net framework 2.0
  • c => es la sintaxis de expresión lambda introducida en C# 3.0.

Si mira la documentación para List<T>.ForEach, puede ver la vieja sintaxis de delegado que se requería en ese momento para llamarla.

0

Foreach de efecto lateral se proporcionará en las extensiones Linq de Visual Studio 2010.

Cuestiones relacionadas