web-dev-qa-db-ja.com

.ForEach()メソッドでcontinueステートメントを使用するにはどうすればよいですか

ForEachメソッドのcontinueステートメントに相当するものはありますか?

List<string> lst = GetIdList();
lst.ForEach(id =>
{
     try
     {
       var article = GetArticle(id);
       if (article.author.contains("Twain"))
       {
         //want to jump out of the foreach now
         //continue; **************this is what i want to do*******

       }

       //other code follows
   }

編集:すべてのすばらしい回答をありがとう。 .foreachは拡張メソッドではないことを明確にしていただきありがとうございます。私はこの構造を使用してコーディングスタイルの一貫性を保ちます(別のプログラマーが同じクラスの別の同様のメソッドに取り組んだ)...そして.foreachの使用を避ける理由へのリンクに感謝します。

22
Laguna

個人的には、List<T>.ForEachではなく標準のforeachループを使用します。

この場合、目的はreturnステートメントを使用することなので、条件を反転させる(その場合のコードを回避する)か、continueを呼び出すことができます。ただし、breakを使用したい場合、これは機能しません。そうは言っても、かなり List<T>.ForEach を避ける理由は他にほとんどないため、これを通常のforeachステートメントに切り替えることを検討します。

19
Reed Copsey

A)ForEachはLINQではなく、List<T>のメソッドです。
B)foreachを使用してください。
C)returnがそれを行います。

編集

明確にするために、あなたがやっていることは、リストの各エントリに対して呼び出されるメソッドを提供することです。 returnは、そのメンバーのメソッドに適用されます。リスト内の残りのメンバーは引き続きメソッドを呼び出します。

57
cadrell0

if条件を反転するだけです:

lst.ForEach(id => {
                      var article = GetArticle(id);
                      if (!article.author.contains("Twain"))
                      {
                          // other code here
                      }
                  });
11
LukeH

使用しているメソッドは List<T>.ForEach で、これはクラスで定義されたメソッドであり、LINQ拡張メソッドではありません。この質問は、実際にはLINQとは関係ありません。

return;に渡されたデリゲートのList<T>.ForEachは、実際のforeach構成要素でcontinue;を使用して概算する必要があります。

3
adamjford

あなたの質問に答えるには:

_List<string> lst = GetIdList();
lst.ForEach(id =>
{
    try
    {
        var article = GetArticle(id);
        if (article.author.contains("Twain"))
            goto _continue;
    }

    //other code follows

    _continue:;
}
_

他の答えは正しいです、.ForEach()は避けてください。
gotoも回避する必要がありますが、コードブロックのショートカットに役立つ場合があります。

2
oddRaven

Foreachを続行すると、ループの先頭までループが戻り、シーケンスの次の項目に戻ります。それが必要な場合は、returnを実行する必要があります。完全に終了したい場合は、Any()のような実際のLINQメソッドを使用して書き直すことができます。

1
Mike