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