列表ForEach休息

tbi*_*hel 16 c# foreach break

有没有办法打破foreach扩展方法?"break"关键字无法将扩展方法识别为可以中断的有效范围.

//Doesn't compile
Enumerable.Range(0, 10).ToList().ForEach(i => { System.Windows.MessageBox.Show(i.ToString()); if (i > 2)break; });
Run Code Online (Sandbox Code Playgroud)

编辑:从问题中删除"linq"


注意代码只是一个示例,显示在扩展方法中没有工作...真正我想要的是用户能够中止处理列表.. UI线程有一个中止变量和for循环只是打破当用户点击取消按钮时.现在,我有一个正常的for循环,但我想看看是否可以使用扩展方法.

Jar*_*Par 17

将其称为List<T>Foreach与LINQ之一可能更为准确.

在任何一种情况下,虽然没有办法打破这个循环.主要是因为它实际上并不是一个循环.这是一个接受在循环内调用的委托的方法.

尽管如此,创建具有中断功能的ForEach非常简单

public delegate void ForEachAction<T>(T value, ref bool doBreak);
public static void ForEach<T>(this IEnumerable<T> enumerable, ForEachAction<T> action) {
    var doBreak = false;
    foreach (var cur in enumerable) {
        action(cur, ref doBreak);
        if (doBreak) {
            break;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以按以下方式重写代码

Enumerable.Range(0,10)
    .ForEach((int i,ref bool doBreak) => {
        System.Windows.MessageBox.Show(i.ToString()); 
        if ( i > 2) {doBreak = true;}
    });
Run Code Online (Sandbox Code Playgroud)


Ste*_*ary 11

我建议使用TakeWhile.

Enumerable.Range(0, 10).TakeWhile(i => i <= 2).ToList().ForEach(i => MessageBox.Show(i.ToString()));
Run Code Online (Sandbox Code Playgroud)

或者,使用Rx:

Enumerable.Range(0, 10).TakeWhile(i => i <= 2).Run(i => MessageBox.Show(i.ToString()));
Run Code Online (Sandbox Code Playgroud)