【问题标题】:How can I use continue statement in .ForEach() method如何在 .ForEach() 方法中使用 continue 语句
【发布时间】:2012-01-10 03:06:03
【问题描述】:

有没有等价于 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 的链接。

【问题讨论】:

  • 如果你想用foraech那么糟糕,用普通的foreach代替
  • 冒着过分强调的风险,使用标准的foreach循环。
  • 重新检查“继续”一词。在循环中,“继续”的意思是“停止处理这个项目并转到下一个项目”。完全退出处理的关键字是“break”

标签: c# .net linq lambda anonymous-methods


【解决方案1】:

A) ForEach 不是 LINQ,它是 List&lt;T&gt; 上的一个方法。
B) 只需使用 foreach。
C) return 会做到的。

编辑

澄清一下,您所做的是提供一种方法,该方法将为列表中的每个条目调用。 return 只会应用于该成员的方法。列表中的其余成员仍将调用该方法。

【讨论】:

  • +1,因为它与所选答案的答案相同,但提前 1 分钟。
【解决方案2】:

就我个人而言,我只会使用标准的 foreach 循环而不是 List&lt;T&gt;.ForEach

在这种情况下,您可以反转条件(以避免这种情况下的代码)或调用return,因为您的目标是使用continue 语句。但是,如果您想break,这将行不通。话虽这么说,有很多few other reasons to avoid List&lt;T&gt;.ForEach,所以我会考虑将其切换为普通的foreach语句。

【讨论】:

    【解决方案3】:

    只需反转您的if 条件:

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

    【讨论】:

      【解决方案4】:

      您使用的方法是List&lt;T&gt;.ForEach,这是在类上定义的方法,而不是 LINQ 扩展方法。这个问题其实和LINQ无关。

      传递给List&lt;T&gt;.ForEach 的委托中的return; 应该在实际的foreach 构造中近似使用continue;

      【讨论】:

        【解决方案5】:

        回答你的问题:

        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,尽管它有时对缩短代码块很有用。

        【讨论】:

          【解决方案6】:

          在 foreach 中继续将循环回到循环顶部到序列中的下一项。如果这就是你想要的,return 应该这样做。如果你想完全退出,你可能想使用像 Any() 这样的实际 LINQ 方法重写它。

          【讨论】:

            猜你喜欢
            • 2013-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-07-11
            • 2011-10-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多