9 Stimmen

Welcher Teil der Sprache C# ist .ForEach()?

Wenn ich jemandem die folgende ForEach-Funktion erkläre, ist es dann korrekt zu sagen, dass #2 die " LINQ foreach-Ansatz " oder ist es einfach ein " List<T> Erweiterungsmethode "die nicht offiziell mit LINQ verbunden ist?

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

24voto

jk. Punkte 13339

es ist eine normale Methode der List<T> obwohl die Leute oft ihre eigenen Erweiterungsmethoden für andere IEnumerable<T> . LINQ bietet keine ForEach-Erweiterung aufgrund seiner Design-Ziele der funktionalen / Arbeit mit unveränderlichen Typen, ForEach ist eine inhärente Seiteneffekt/imperative Operation.

10voto

LukeH Punkte 251752

Es hat nichts mit LINQ zu tun und ist keine Erweiterungsmethode.

ForEach ist eine einfache Instanzmethode auf der List<T> Klasse.

(Und wenn Sie wirklich pingelig sein wollen, dann ForEach ist überhaupt nicht Teil der C#-Sprache: es ist Teil der .NET Base Class Library).

2voto

David Hedlund Punkte 125085

Es handelt sich nicht um eine Erweiterungsmethode von List<T> ist es eine reguläre Methode der List<T> .

Es hat also nichts mit LINQ zu tun. Und wenn doch, ist die Unterscheidung zwischen "offiziell mit LINQ verbunden" und "nicht offiziell mit LINQ verbunden" praktisch nicht sehr nützlich. LINQ ist einfach ein Bündel von verketteten Erweiterungsmethoden (oft auf IEnumerable<T> ). Es hat kaum einen Sinn, sie von anderen Erweiterungsmethoden zu unterscheiden IEnumerable<T> . Die beste Unterscheidung wäre, dass sie in einem der System.Linq o System.Something.Linq Namespaces.

2voto

spender Punkte 111351

Es ist nicht LINQ. Einer der Designaspekte von LINQ ist, dass die Standard-LINQ-Methoden keine Seiteneffekte haben. Die ForEach-Methode würde dies verletzen.

Eric Lippert hat einen Blogartikel zu diesem Thema verfasst:

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

1voto

Amy B Punkte 104656
youngCustomers.ToList().ForEach(c => Console.WriteLine(c.Display())); 

Schauen wir uns das mal an:

  • ToList ist ein Aufruf an System.Linq.Enumerable.ToList() eingeführt in .net framework 3.5
  • ForEach ist ein Aufruf an System.Collections.Generic.List<T>.ForEach eingeführt in .net framework 2.0
  • c => ist die in c# 3.0 eingeführte Syntax für Lambda-Ausdrücke.

Wenn Sie sich die Dokumentation für List<T>.ForEach können Sie die alte Delegatensyntax sehen, die damals für den Aufruf erforderlich war.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X