Frage

Wenn ich erkläre die folgende ForEach-Funktion, um jemanden ist es richtig zu sagen, dass #2 ist "LINQ foreach-Ansatz"oder ist es einfach ein "List<T> extension-Methode"das ist nicht offiziell im Zusammenhang mit 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()));
War es hilfreich?

Lösung

es ist eine normale Methode List<T> obwohl die Menschen oft Ihre eigenen erweiterungsmethoden für andere IEnumerable<T>. LINQ nicht eine ForEach-Erweiterung durch seine design-Ziele von funktionalen/ arbeiten mit unveränderlichen Typen, ForEach ist ein inhärent Nebenwirkung/Imperativ Betrieb.

Andere Tipps

Es hat nichts zu tun mit LINQ und es ist nicht eine extension-Methode.

ForEach ist eine einfache Instanz-Methode auf den List<T> Klasse.

(Und wenn Sie wollte wirklich nitpicky, dann ForEach ist nicht Teil der Sprache C# an alle:es ist Teil des .NET Base Class Library.)

Es ist nicht eine Verlängerung Methode List<T>, es ist eine herkömmliche Methode List<T>.

So, es hat nichts zu tun mit LINQ.Wenn es hatte, die Unterscheidung zwischen "offiziell im Zusammenhang mit LINQ" und nicht offiziell im Zusammenhang mit LINQ ist in der Praxis nicht sehr nützlich.LINQ ist einfach ein Haufen von verketteten Erweiterung Methoden (oft auf IEnumerable<T>).Es gibt kaum eine Unterscheidung von anderen erweiterungsmethoden auf IEnumerable<T>.Die beste Unterscheidung wäre, dass Sie Ihren Wohnsitz in einem der System.Linq oder System.Something.Linq namespaces.

Es ist nicht LINQ.Einer der design-Aspekte von LINQ ist, dass die standard-LINQ-Methoden haben keine Nebenwirkungen.Die ForEach-Methode würde verletzen.

Eric Lippert hat einen blog-Artikel über dieses:

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

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

Let ' s break it down:

  • ToList ein Aufruf zur System.Linq.Enumerable.ToList() eingeführt .net framework 3.5
  • ForEach ein Aufruf zur System.Collections.Generic.List<T>.ForEach eingeführt .net framework 2.0
  • c => ist lambda-Ausdruck-syntax eingeführt, die in c# 3.0.

Wenn Sie sich die Dokumentation für List<T>.ForEach, Sie können sehen, dass die alte zu delegieren syntax, die erforderlich war, damals zu nennen.

Side-effecting foreach wird ( ist ) in Visual Studio 2010 Linq-Erweiterungen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top