2012-01-30 9 views
4

私はいくつかのリストを持っており、私はlist.ForEach(l => { ... something ...})をしています。今、特定の条件で、私はリストの反復を停止する必要がありますが、breakは動作しません - 私は "Control cannot leave the body of an anonymous method or lambda expression"コンパイルエラーを取得します。ラムダ式の本文を残す方法

どのようにその制限を克服することができますか?

答えて

7

ラムダがforループとは異なる方法で実行されるため、breakを単独で使用するとここでは機能しません。 A breakステートメントは、現在の関数のローカルな構造体を分割する場合にのみ有効です。

ブレークスタイルをサポートするには、ForEachのオーバーロードを追加する必要があります。ここで、代理人は、ループ実行が中断する戻り値を指定できます。例

public static void ForEach<T>(this IEnumerable<T> enumerable, Func<T, bool> func) { 
    foreach (var cur in enumerable) { 
    if (!func(cur)) { 
     break; 
    } 
    } 
} 

のために今、このForEach方法の消費者が提供するコールバック

myCollection.ForEach(current => { 
    if (someCondition) { 
    // Need to break 
    return false; 
    } 
    // Keep going 
    return true; 
} 
6

ラムダ式は、メソッドと同じように機能します。
できる場合はいつでもreturnできます。

ただし、List.ForEachは、早すぎる反復を停止する方法を提供していません。
breakが必要な場合は、通常のforeachループを使用します。

+0

からfalseを返すことによってbreakを指定することができますし、条件付きでスキップする必要がある場合は、continue' 'のレウで何をするだろう反復 - それはどちらもうまくいかない。 – Andrey

+0

ラムダはループ内でブール値を返すようにし、falseを返した場合は中断します。 –

+3

ここで 'return'は' continue'のように動作し、 'break'とは異なります。 – porges

1

ラムダを呼び出す外側のループを制御できないため、ForEachラムダ内で反復を停止することはできません。この時点で、通常のforeachループとbreakステートメントを使用しないでください。この場合、はるかに読みやすくなります。

+0

ラムダを使用する唯一の理由は、ラムダの使用が好きで、それがC#に追加された唯一の理由です。あなたは正しい - 特定のケースでうまく動作しない場合は、foreachなどを使用します。私はまだそれを使用する方法がある場合だけ興味があります。それだけです、好奇心が強いです:) – Andrey

+0

@ JaredParの答えは、 – BrokenGlass