Есть ли в C # аналог алгоритма std :: for_each (Linq to Objects) - PullRequest
3 голосов
/ 06 февраля 2011

Есть ли в C # аналог алгоритма std :: for_each (Linq to Objects), чтобы можно было передать в него Func<>?Как

sequence.Each(p => p.Some());

вместо

foreach(var elem in sequence)
{
  elem.Some();
}

Ответы [ 2 ]

6 голосов
/ 06 февраля 2011

В самом языке C # есть оператор foreach.

Поскольку Джон намекает (а Эрик прямо заявляет ), разработчики LINQ хотели оставить методы без побочных эффектов, тогда как ForEach нарушит этот контракт.

На самом деле - это метод ForEach, который применяет данный предикат в классах List<T> и Array, но он был введен в .NET Framework 2.0, а LINQ поставляется только с 3.5. Они не связаны.

В конце концов, вы всегда можете придумать свой собственный метод расширения :

public static void ForEach<T> (this IEnumerable<T> enumeration, Action<T> action)
{
    foreach (T item in enumeration)
        action (item);
}

Я согласен, что это полезно, если у вас уже есть метод с одним параметром, и вы хотите запустить его для каждого элемента.

var list = new List<int> {1, 2, 3, 4, 5};
list.Where (n => n > 3)
    .ForEach (Console.WriteLine);

Однако в других случаях я считаю, что хороший текст foreach намного чище и лаконичнее.

Кстати, однопараметрический метод void - это не Func<T>, а Action<T>.
Func<T> обозначает функцию, которая возвращает T, а Action<T> обозначает метод void, который принимает T.

3 голосов
/ 06 февраля 2011

System.Collections.Generic.List<T> имеет метод void ForEach(Action<T> action), который выполняет предоставленный делегат для каждого элемента списка. Класс Array также предоставляет такой метод.

...