Если я объясняю следующую функцию ForEach кому-то, это с точностью до, говорят, что № 2 "LINQ foreach подход" или является им просто"List<T>
дополнительный метод", который официально не связан с 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()));
это обычный метод List
, хотя люди часто предоставляют свои собственные методы расширения для других IEnumerable
. LINQ не предоставляет расширение ForEach из-за того, что его проектные цели заключаются в функциональности / работе с неизменяемыми типами, ForEach по своей сути является побочным эффектом / императивной операцией.
Это не метод расширения List
, это обычный метод List
.
Так что это не имеет ничего общего с LINQ. Если бы это было так, различие между «официально связанным с LINQ» и официально не связанным с LINQ было бы не очень полезным. LINQ - это просто набор связанных методов расширения (часто на IEnumerable
). Редко есть смысл отличать его от других методов расширения на IEnumerable
. Лучшее различие будет заключаться в том, что они находятся в одном из пространств имен System.Linq
или System.Something.Linq
.
Это не имеет ничего общего с LINQ и не является методом расширения.
ForEach
- это простой метод экземпляра класса List
.
(И если вы хотите быть действительно придирчивым, тогда ForEach
вообще не является частью языка C #: это часть библиотеки базовых классов .NET.)
youngCustomers.ToList().ForEach(c => Console.WriteLine(c.Display()));
Давайте разберемся:
ToList
- это вызов System.Linq.Enumerable.ToList ()
, представленный в .NET framework 3.5 ForEach
- это вызов to System.Collections.Generic.List .ForEach
, представленный в .net framework 2.0 c =>
- это синтаксис лямбда-выражений, представленный в C # 3.0. Если вы посмотрите документацию для List
, вы увидите старый синтаксис делегата, который требовался тогда для его вызова.
Это не LINQ. Одним из аспектов дизайна LINQ является то, что стандартные методы LINQ не имеют побочных эффектов. Метод ForEach нарушит это.
Эрик Липперт написал об этом в блоге статью:
http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx
Побочный эффект foreach будет (есть) в расширениях Linq Visual Studio 2010.