有没有办法突破foreach扩展方法? “break”关键字无法将扩展方法识别为有效的突破范围。

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

编辑:从问题中删除“linq”

请注意,代码只是一个示例,显示中断无法在扩展方法中使用...确实,我想要的是用户能够中止处理列表。.UI线程具有中止变量,并且for循环刚刚中断当用户点击取消按钮时。现在,我有一个普通的for循环,但是我想看看扩展方法是否可行。

最佳答案

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

无论哪种情况,虽然没有,但是没有办法打破这个循环。主要是因为它实际上不是每个人说的循环。这是一种在循环内调用委托(delegate)的方法。

尽管创建具有断点功能的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;
        }
    }
}

然后,您可以按以下方式重写代码
Enumerable.Range(0,10)
    .ForEach((int i,ref bool doBreak) => {
        System.Windows.MessageBox.Show(i.ToString());
        if ( i > 2) {doBreak = true;}
    });

关于c# - 列出每次休息,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3145563/

10-11 22:43
查看更多