私はいくつかのリストを持っており、私はlist.ForEach(l => { ... something ...})
をしています。今、特定の条件で、私はリストの反復を停止する必要がありますが、break
は動作しません - 私は "Control cannot leave the body of an anonymous method or lambda expression
"コンパイルエラーを取得します。ラムダ式の本文を残す方法
どのようにその制限を克服することができますか?
私はいくつかのリストを持っており、私はlist.ForEach(l => { ... something ...})
をしています。今、特定の条件で、私はリストの反復を停止する必要がありますが、break
は動作しません - 私は "Control cannot leave the body of an anonymous method or lambda expression
"コンパイルエラーを取得します。ラムダ式の本文を残す方法
どのようにその制限を克服することができますか?
ラムダが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;
}
ラムダ式は、メソッドと同じように機能します。
できる場合はいつでもreturn
できます。
ただし、List.ForEach
は、早すぎる反復を停止する方法を提供していません。
break
が必要な場合は、通常のforeach
ループを使用します。
ラムダを呼び出す外側のループを制御できないため、ForEach
ラムダ内で反復を停止することはできません。この時点で、通常のforeach
ループとbreak
ステートメントを使用しないでください。この場合、はるかに読みやすくなります。
ラムダを使用する唯一の理由は、ラムダの使用が好きで、それがC#に追加された唯一の理由です。あなたは正しい - 特定のケースでうまく動作しない場合は、foreachなどを使用します。私はまだそれを使用する方法がある場合だけ興味があります。それだけです、好奇心が強いです:) – Andrey
@ JaredParの答えは、 – BrokenGlass
から
false
を返すことによってbreak
を指定することができますし、条件付きでスキップする必要がある場合は、continue' 'のレウで何をするだろう反復 - それはどちらもうまくいかない。 – Andreyラムダはループ内でブール値を返すようにし、falseを返した場合は中断します。 –
ここで 'return'は' continue'のように動作し、 'break'とは異なります。 – porges