1

LINQ新しいシーケンスに投影せずに、すべての要素に対して何らかのアクションを実行できるシーケンス演算子がありますか?

これは少しぎこちなく見えるかもしれませんが、私が知っているだけです:)

例:

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

明らかに、これは次のようなものを使用して実行できます。

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

でも、何かが本当にあるなら、それは素晴らしいことです。

4

4 に答える 4

6

いいえ、存在しません。特にあなたが言及した理由は次のとおりです。他のすべてのオペレーターとはまったく異なる動作をする単一のオペレーターを持つのは厄介なようです。

C# コンパイラ開発者の 1 人である Eric Lippert は、これに関する記事を書いています。

しかし、ここでもう少し深く掘り下げることができます。私は、2 つの理由から、そのような方法を提供することに哲学的に反対しています。

最初の理由は、他のすべてのシーケンス演算子が基づいている関数型プログラミングの原則に違反することです。明らかに、このメソッドを呼び出す唯一の目的は、副作用を引き起こすことです。

式の目的は値を計算することであり、副作用を引き起こすことではありません。ステートメントの目的は、副作用を引き起こすことです。このことの呼び出しサイトは、式に非常によく似ています (ただし、確かに、メソッドは void を返すため、式は「ステートメント式」コンテキストでのみ使用できます)。

副作用にのみ役立つ唯一無二のシーケンス演算子を作成することは、私にはうまくいきません。

于 2011-03-28T18:52:40.583 に答える
4

この方法を使用できます:

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;
    }
}

ソースを返すので、必要に応じて別の拡張メソッドに渡すことができます。または、無効にしたい場合は、メソッドを少し変更できます。

于 2011-03-28T18:52:02.487 に答える
2

morelinqプロジェクトには演算子があります。ForEachLINQ はすべて関数型プログラミングに関するものであり、ForEach副作用があるため、LINQ 自体はそうではありません。

于 2011-03-28T18:51:40.023 に答える
0

これは、コレクション内のすべてのオブジェクトに対してメソッドを実行することに関する同様の議論です

于 2011-03-28T18:57:37.543 に答える