Какая часть языка C# является.ForEach ()?

Если я объясняю следующую функцию 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()));
9
задан Edward Tanguay 19 July 2010 в 13:18
поделиться

6 ответов

это обычный метод List , хотя люди часто предоставляют свои собственные методы расширения для других IEnumerable . LINQ не предоставляет расширение ForEach из-за того, что его проектные цели заключаются в функциональности / работе с неизменяемыми типами, ForEach по своей сути является побочным эффектом / императивной операцией.

24
ответ дан 4 December 2019 в 06:22
поделиться

Это не метод расширения List , это обычный метод List .

Так что это не имеет ничего общего с LINQ. Если бы это было так, различие между «официально связанным с LINQ» и официально не связанным с LINQ было бы не очень полезным. LINQ - это просто набор связанных методов расширения (часто на IEnumerable ). Редко есть смысл отличать его от других методов расширения на IEnumerable . Лучшее различие будет заключаться в том, что они находятся в одном из пространств имен System.Linq или System.Something.Linq .

2
ответ дан 4 December 2019 в 06:22
поделиться

Это не имеет ничего общего с LINQ и не является методом расширения.

ForEach - это простой метод экземпляра класса List .

(И если вы хотите быть действительно придирчивым, тогда ForEach вообще не является частью языка C #: это часть библиотеки базовых классов .NET.)

10
ответ дан 4 December 2019 в 06:22
поделиться
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 .ForEach , вы увидите старый синтаксис делегата, который требовался тогда для его вызова.

1
ответ дан 4 December 2019 в 06:22
поделиться

Это не LINQ. Одним из аспектов дизайна LINQ является то, что стандартные методы LINQ не имеют побочных эффектов. Метод ForEach нарушит это.

Эрик Липперт написал об этом в блоге статью:

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

2
ответ дан 4 December 2019 в 06:22
поделиться

Побочный эффект foreach будет (есть) в расширениях Linq Visual Studio 2010.

0
ответ дан 4 December 2019 в 06:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: