11

ラムダを使用する一般的な ForEach を終了できるかどうかは誰にもわかりませんか? 例えば

someList.ForEach(sl =>
  {
    if (sl.ToString() == "foo")
        break;

    // continue processing sl here
    // some processing code
  }
);

このコード自体はコンパイルされません。通常の foreach を使用できることはわかっていますが、一貫性を保つためにラムダを使用したいと考えています。

どうもありがとう。

4

4 に答える 4

19

もちろん。ただし、最初に、これを推奨しないことに注意してください。私は、シーケンス演算子には副作用があってはならず、ステートメントには副作用があるべきだと言います。その ForEach ラムダで何かをしている場合は、シーケンス演算子のように見せるのではなく、foreach ループの本体のステートメントにします。

そうは言っても、これがあなたがすることです。まず、リストだけでなく、任意のシーケンスで機能する ForEach を自分で作成します。

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

そして今、次のように休憩を書きます。

someList
    .TakeWhile(x=>x.ToString() != "foo")
    .ForEach(sl=>
    {/*your action here*/});
于 2010-02-12T03:09:55.420 に答える
10

MSDNから

ラムダ式の変数スコープには、次の規則が適用されます。

snip

ラムダ式には、ターゲットが本体の外側または含まれる無名関数の本体内にある goto ステートメント、break ステートメント、または continue ステートメントを含めることはできません。

投稿したコードが役立つかどうかはわかりません。関連する引用は、MSDN の記事の最後からのものです。

于 2010-02-12T03:10:02.337 に答える
2

警告: 以下のコードは真剣に受け止めるべきではなく、娯楽目的でのみ提供されています!

次のように、早期リターンで続行を「シミュレート」できます。

Enumerable.Range(1, 20)
          .ForEach(n =>
                {
                    if (n == 10) return;
                    Console.WriteLine("This is not 10: {0}", n);
                });

そうは言っても、ラムダ内の副作用は、あなたが間違っていることを示していると思います。代わりに適切な foreach を使用してください。または、TakeWhile のようなものです。

于 2010-02-12T09:12:49.290 に答える
1

これはどう?

        Enumerable.Range(1, 10)
        .Where(x => x % 2 != 0)
        .ToList()
        .ForEach(x => Console.WriteLine(x));
于 2010-02-12T09:47:29.207 に答える