C # Linq вопрос - PullRequest
       29

C # Linq вопрос

1 голос
/ 28 марта 2011

Имеет ли LINQ оператор последовательности, который позволяет выполнять какое-либо действие с каждым элементом, не проецируя его на новую последовательность?

Это может показаться немного неловким, но только для менязнать:)

Пример:

IEnumerable<IDisposable> x;
x.PERFORM_ACTION_ON_EVERY_ELEMENT(m => m.Dispose());

Очевидно, это можно сделать, используя что-то вроде:

foreach (var element in x) x.Dispose();

Но если что-то действительно существует, это было бы хорошо.

Ответы [ 4 ]

6 голосов
/ 28 марта 2011

Нет, его не существует.В частности, по той причине, которую вы упомянули: кажется неловко иметь одного оператора, который ведет себя совершенно иначе, чем все остальные.

Эрик Липперт, один из разработчиков компилятора C # , имеет статью об этом.

Но мы можем пойти немного глубже.Я философски против предоставления такого метода по двум причинам.

Первая причина заключается в том, что это нарушает принципы функционального программирования, на которых основаны все другие операторы последовательности.Очевидно, что единственная цель вызова этого метода - вызвать побочные эффекты.

Цель выражения - вычислить значение, а не вызвать побочный эффект.Целью утверждения является побочный эффект.Сайт вызова этой вещи будет выглядеть очень похоже на выражение (хотя, по общему признанию, поскольку метод возвращает пустоту, выражение можно использовать только в контексте «выражения выражения»).

Это действительно так.мне не нравится делать один-единственный оператор последовательности, который полезен только для его побочных эффектов.

4 голосов
/ 28 марта 2011

Вы можете использовать этот метод:

public static class Extension
{
    public static IEnumerable<T> ForEach<T>(this IEnumerable<T> source, Action<T> action)
    {
        foreach (var t in source)
        {
            action(t);
        }
        return source;
    }
}

Возвращает источник, чтобы при необходимости вы могли передать его другому методу расширения.Или, если вы хотите быть недействительным, вы можете немного изменить метод.

2 голосов
/ 28 марта 2011

В проекте morelinq есть оператор ForEach.Сам по себе LINQ этого не делает, поскольку LINQ полностью посвящен функциональному программированию, а ForEach имеет побочные эффекты.

0 голосов
/ 28 марта 2011

Вот аналогичное предположение для этого Запустите метод для всех объектов в коллекции

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...