【问题标题】:C# Break out of foreach loop after X number of itemsC# 在 X 个项目后跳出 foreach 循环
【发布时间】:2010-11-18 19:12:44
【问题描述】:

在我的 foreach 循环中,我想在 50 个项目后停止,当我到达第 50 个项目时,你将如何打破这个 foreach 循环?

谢谢

foreach (ListViewItem lvi in listView.Items)

【问题讨论】:

  • @Jade,我并不是要不尊重 Hamish,但我认真地认为你接受了错误的答案。如果您预先知道要执行循环的多少次迭代,则有一种特定于该循环的语言结构,那就是 for 循环。突破 foreach 并不是一件坏事,因此 Hamish 的回答并没有错……但作为一个典型的经验法则,如果您可以避免 Jumps(这就是休息),您应该这样做。我并不是说要编写复杂的代码来避免中断,有时中断是最好的选择,但在这种情况下,最确定的就是一个简单的 for 循环。
  • @Tim Jarvis,我不认为你不尊重我。您在说什么(这是对问题的有效回答)是@Jade M 提出了错误的问题。而不是“我如何跳出 foreach 循环?”真正的问题是“如果我想迭代已知的最大迭代次数,我应该使用什么迭代代码构造?”
  • @Hamish,嗯,是的,你是对的,简而言之就是这样。

标签: c# foreach


【解决方案1】:
int processed = 0;
foreach(ListViewItem lvi in listView.Items)
{
   //do stuff
   if (++processed == 50) break;
}

或使用 LINQ

foreach( ListViewItem lvi in listView.Items.Cast<ListViewItem>().Take(50))
{
    //do stuff
}

或者只使用常规的 for 循环(如 @sgriffinusa 和 @Eric J. 所建议的那样)

for(int i = 0; i < 50 && i < listView.Items.Count; i++)
{
    ListViewItem lvi = listView.Items[i];
}

【讨论】:

  • ListViewItemCollection 没有定义 Take() 的实现。您上面的示例将无法编译。您可能可以执行类似 theListView.Items.Cast().Take(50) 的操作,但我认为简单的 for 循环会更高效。
  • ListViewItemCollection 没有实现 IEnumerable,不能使用 LINQ
  • Enumerable.Cast 解决了这个问题: Cast)>)(IEnumerable) 方法通过提供必要的类型信息。例如,ArrayList 没有实现 IEnumerable)>) ,但是通过在 ArrayList 对象上调用 Cast)>)(IEnumerable) ,可以使用标准查询运算符查询序列。
【解决方案2】:

为什么不使用常规的 for 循环?

for(int i = 0; i < 50 && i < listView.Items.Count; i++)
{
    ListViewItem lvi = listView.Items[i];
}

已更新以解决 Ruben 和 Pragmatrix 指出的错误。

【讨论】:

  • if (listView.Items.Count
【解决方案3】:

或者只是使用常规的 for 循环而不是 foreach。 for 循环稍微快一些(尽管您不会注意到差异,除非在非常时间关键的代码中)。

【讨论】:

    【解决方案4】:

    这应该可行。

    int i = 1;
    foreach (ListViewItem lvi in listView.Items) {
        ...
        if(++i == 50) break;
    }
    

    【讨论】:

      【解决方案5】:
      int count = 0;
      foreach (ListViewItem lvi in listView.Items)
      {
          if(++count > 50) break;
      }
      

      【讨论】:

        【解决方案6】:

        只需使用 break,就像这样:

        int cont = 0;
        foreach (ListViewItem lvi in listView.Items) {
           if(cont==50) { //if listViewItem reach 50 break out.
              break; 
           }
           cont++;   //increment cont.
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-04-09
          • 1970-01-01
          • 2012-02-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多