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()));
Foi útil?

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 tem nada a ver com LINQ e não é um método de extensão.

ForEach é um método de instância simples no List<T> aula.

(E se você quiser ser realmente minucioso, então ForEach não faz parte da linguagem C#:faz parte da biblioteca de classes base do .NET.)

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 para System.Linq.Enumerable.ToList() introduzido no framework .net 3.5
  • ForEach é um chamado para System.Collections.Generic.List<T>.ForEach introduzido no .net framework 2.0
  • c => é 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top