Qual parte da linguagem C# é .ForEach()?
-
17-09-2020 - |
Pergunta
Se estou explicando o seguinte recurso ForEach para alguém, é correto dizer que o número 2 é o "Abordagem LINQ foreach"ou é simplesmente um"List<T>
método de extensão"que não está oficialmente associado ao 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()));
Solução
é um método normal de List<T>
embora as pessoas muitas vezes forneçam seus próprios métodos de extensão para outros IEnumerable<T>
. LINQ não fornece uma extensão ForEach devido aos seus objetivos de design de ser funcional/trabalhar com tipos imutáveis, ForEach é um efeito colateral/operação imperativa inerente.
Outras dicas
Não é um método de extensão de List<T>
, é um método regular de List<T>
.
Portanto, não tem nada a ver com LINQ.Se tivesse, a distinção entre "oficialmente associado ao LINQ" e não oficialmente associado ao LINQ não seria praticamente muito útil.LINQ é simplesmente um monte de métodos de extensão encadeados (geralmente em IEnumerable<T>
).Raramente faz sentido distingui-lo de outros métodos de extensão em IEnumerable<T>
.A melhor distinção seria que eles residem em um dos System.Linq
ou System.Something.Linq
espaços para nome.
Não é LINQ.Um dos aspectos de design do LINQ é que os métodos LINQ padrão não apresentam efeitos colaterais.O método ForEach violaria isso.
Eric Lippert tem um artigo no blog sobre isso:
http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx
youngCustomers.ToList().ForEach(c => Console.WriteLine(c.Display()));
Vamos decompô-lo:
ToList
é um chamado paraSystem.Linq.Enumerable.ToList()
introduzido no framework .net 3.5ForEach
é um chamado paraSystem.Collections.Generic.List<T>.ForEach
introduzido no .net framework 2.0c =>
é a sintaxe da expressão lambda introduzida no c# 3.0.
Se você olhar a documentação para List<T>.ForEach
, você pode ver a antiga sintaxe do delegado necessária naquela época para chamá-lo.
O efeito colateral foreach será (é) fornecido nas extensões Linq do Visual Studio 2010.