2010-07-19 12 views
9

Wenn ich die folgende FürJeden Funktion jemand erklären, ist es richtig zu sagen, dass # 2 der „LINQ foreach Ansatz“ ist oder ist es einfach eine „List<T> Erweiterungsmethode“, die nicht offiziell mit LINQ zugeordnet ist, ?Welcher Teil der C# -Sprache ist .ForEach()?

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

Überprüfen Sie diesen Beitrag von Eric Lippert http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx –

+1

Es ist erwähnenswert, dass Ihre # 2 Schleife durch die Elemente zweimal - einmal zum Erstellen der Liste und einmal für die ForEach-Methode.Wenn Sie diesen völlig legitimen Code verwenden möchten, schreiben Sie besser Ihre eigene ForEach-Erweiterungsmethode für IEnumerable. –

Antwort

24

it is a normal method of List<T> obwohl die Leute oft für andere IEnumerable<T> ihre eigenen Erweiterungsmethoden bieten. LINQ does not provide a ForEach extension ForEach ist aufgrund seiner Designziele, funktionell zu sein und mit unveränderlichen Typen zu arbeiten, eine inhärente Nebenwirkung/imperative Operation.

+0

Dies ist, was ich vermutete, aber war unsicher, da, wenn Sie eine Google-Suche nach "linq foreach" zu tun scheint weit verbreitetes Missverständnis, dass.ForEach() ist eine Funktion von LINQ –

10

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

ForEach ist eine einfache Instanzmethode für die List<T> Klasse.

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

+0

Base Class Library (BCL) alias Framework Class Library (FCL) – abatishchev

+0

@abatiishchev: Mein Verständnis ist, dass die BCL und FCL auch nicht sind. Der FCL ist ein Superset des BCL. Siehe http://en.wikipedia.org/wiki/Base_Class_Library und http://en.wikipedia.org/wiki/Framework_Class_Library. – LukeH

+0

Ja, ich sah sie beide. Ich denke diese zwei Artikel sind etwas undeutlich. Ich weiß nicht, warum Microsoft sie noch nicht bearbeitet hat. Wie aus den Artikeln hervorgeht, enthält BCL nur ECMA-standardisierte Namespaces und FCL - alle Standard-Namespaces. Recht? – abatishchev

2

Es ist nicht eine Erweiterungsmethode von List<T> ist, Es ist eine normale Methode von List<T>.

So hat es nichts mit LINQ zu tun. Wenn dies der Fall ist, ist die Unterscheidung zwischen "offiziell verbunden mit LINQ" und nicht offiziell mit LINQ verbunden, praktisch nicht sehr nützlich. LINQ ist einfach eine Reihe von verketteten Erweiterungsmethoden (oft unter IEnumerable<T>). Es ist selten sinnvoll, sie von anderen Erweiterungsmethoden unter IEnumerable<T> zu unterscheiden. Die beste Unterscheidung wäre, dass sie sich in einem der Namensräume System.Linq oder System.Something.Linq befinden.

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

Lassen Sie uns es brechen:

  • ToList ist ein Aufruf an System.Linq.Enumerable.ToList() in .net Framework eingeführt 3,5
  • ForEach ist ein Aufruf an System.Collections.Generic.List<T>.ForEach eingeführt .net Framework 2.0
  • c => ist Lambda-Ausdruck Syntax in C# 3.0 eingeführt.

Wenn man sich die Dokumentation sucht List<T>.ForEach, können Sie die alte Delegat Syntax sehen, die damals notwendig war es zu nennen.

0

Side-Effecting foreach wird in den Linq-Erweiterungen von Visual Studio 2010 bereitgestellt.

Verwandte Themen