Qué parte del lenguaje C# es .ForEach()?
-
17-09-2020 - |
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()));
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 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 laSystem.Linq.Enumerable.ToList()
introducido en .net framework 3.5ForEach
es una llamada a laSystem.Collections.Generic.List<T>.ForEach
introducido en .net framework 2.0c =>
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.