C#如何在遍历X个项目后跳出foreach循环

40

在我的foreach循环中,我想在50个项后停止,当我到达第50个项时,如何跳出这个foreach循环?

谢谢

foreach (ListViewItem lvi in listView.Items)

7
@Jade,我不是想不尊重Hamish,但我认为你接受了错误的答案。如果你事先知道要执行多少次循环,那么有一个特定于该操作的语言结构,即for循环。从foreach中跳出并不是一件坏事,因此Hamish的答案并没有错...但通常情况下,如果可以避免Jump(这就是break的作用),那就应该避免。我不是说写复杂的代码来避免breaks,有时breaks确实是最好的选择,但在这种情况下,最确定的方法是简单的for循环。 - Tim Jarvis
4
@Tim Jarvis,我不认为你不尊重我。你所说的话(并且这是一个对问题有效的回答)是@Jade M提出了错误的问题。真正的问题不是“如何跳出foreach循环?”,而是“如果我想迭代已知的最大次数,应该使用什么迭代代码结构?” - Hamish Smith
1
@Hamish,嗯,是的,你说得对,这就是要点。 - Tim Jarvis
6个回答

124
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];
}

1
ListViewItemCollection没有定义Take()的实现。你上面的例子编译不了。 你可以尝试像这样:theListView.Items.Cast<ListViewItem>().Take(50) ,但我认为一个简单的for循环会更高效。 - Tim Jarvis
ListViewItemCollection没有实现IEnumerable<T>,无法使用LINQ。 - Marc
Enumerable.Cast<T>修复了这个问题:Cast<(Of <(TResult>)>)(IEnumerable)方法通过提供必要的类型信息,使标准查询运算符能够在非泛型集合上调用。例如,ArrayList没有实现IEnumerable<(Of <(T>)>),但是通过在ArrayList对象上调用Cast<(Of <(TResult>)>)(IEnumerable),则可以使用标准查询运算符来查询序列。 - Steve Gilham

24

为什么不使用普通的for循环?

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

根据Ruben和Pragmatrix指出的bug进行了更新。


4
如果(listView.Items.Count < 50),则抛出一个 OutOfRangeException 异常。 - Armin

7

或者使用普通的for循环代替foreach。for循环略微更快(尽管除非在非常时间关键的代码中,您不会注意到差别)。


4
这应该可以正常工作。
int i = 1;
foreach (ListViewItem lvi in listView.Items) {
    ...
    if(++i == 50) break;
}

2
int count = 0;
foreach (ListViewItem lvi in listView.Items)
{
    if(++count > 50) break;
}

0

只需使用 break,就像这样:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接