Was Teil der Sprache C# ist .ForEach()?
-
17-09-2020 - |
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()));
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 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 zurSystem.Linq.Enumerable.ToList()
eingeführt .net framework 3.5ForEach
ein Aufruf zurSystem.Collections.Generic.List<T>.ForEach
eingeführt .net framework 2.0c =>
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.