C# 每个中断的列表

C# 每个中断的列表,c#,foreach,break,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; }); 编辑:从问题中删除“linq” 请注意,该代码只是一个示例,显示break在扩展方法中不起作用。。。实际上,我希望用

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

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

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



请注意,该代码只是一个示例,显示break在扩展方法中不起作用。。。实际上,我希望用户能够中止处理列表。。UI线程有一个abort变量,当用户点击cancel按钮时for循环刚好中断。现在,我有一个正常的for循环,但我想看看是否可以使用扩展方法。

将其称为
列表与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;
        }
    }
}

为什么不用
Where

Enumerable.Range(0, 10).Where(i => i <= 2).ToList().ForEach(...)
Enumerable.Range(0,10)。其中(i=>i我建议使用

Enumerable.Range(0,10).TakeWhile(i=>i MessageBox.Show(i.ToString());
或者,使用:

Enumerable.Range(0,10).TakeWhile(i=>i MessageBox.Show(i.ToString());

为什么不使用
foreach

PS:只是开个玩笑,正如你提到的,我理解尝试用Linq做这件事的想法(出于同样的原因,我在这里用谷歌搜索了一下)…现在,出于生产代码中维护/准备的原因,猜测一个简单的
foreach
有时就足够了。

尝试使用“return”语句而不是“break”;它是一个委托函数,而不是一个真正的循环

尝试:


对于我自己,我使用了Linq Select+FirstOrDefault.Transform列表中的“each”,但由于我们要求第一个,它会在找到第一个匹配的后停止转换

var thingOption = list.Select(thing => AsThingOption(thing))
.FirstOrDefault(option => option.HasValue) ?? Option.None<MyThing>;
var thingOption=list.Select(thing=>ashingoption(thing))
.FirstOrDefault(option=>option.HasValue)??option.None;
正如您所见,我正在将每件事转换为一个选项,我的方法AshingOption可能会成功转换,当它转换成功时,我们停止对列表进行迭代。如果AshingOption方法中的条件在转换时从未成功,那么最终结果是无


希望有帮助!

为什么不
抛出新异常(“特定消息”)
或使用布尔标志

DataTable dt = new DataTable();
bool error = false;

try
{
    dt.AsEnumerable().ToList().ForEach(dr =>
    {
        if (dr["Col1"].ToString() == "")
        {
            error = true;
            throw new Exception("Specific message");
        }
        else 
            // Do something
    });
}
catch (Exception ex)
{
    if (ex.Message == "Specific message" || error) 
        // do something
    else
        throw ex;
}

我有一种情况,我需要循环操作,直到条件为false,并且每个操作都可以修改用于跟踪条件的值。我提出了.TakeWhile()的这个变体。这里的优点是列表中的每个项都可以参与一些逻辑,然后可以在与该项没有直接关系的条件下中止循环

new List<Action> {
    Func1,
    Func2
}.TakeWhile(action => {
    action();
    return _canContinue;
});
新列表{
职能1,
功能2
}.TakeWhile(操作=>{
动作();
返回-可以继续;
});
Enumerable.Range(0, 10).ToList().ForEach(i => { System.Windows.MessageBox.Show(i.ToString()); if (i > 2) return; });
var thingOption = list.Select(thing => AsThingOption(thing))
.FirstOrDefault(option => option.HasValue) ?? Option.None<MyThing>;
DataTable dt = new DataTable();
bool error = false;

try
{
    dt.AsEnumerable().ToList().ForEach(dr =>
    {
        if (dr["Col1"].ToString() == "")
        {
            error = true;
            throw new Exception("Specific message");
        }
        else 
            // Do something
    });
}
catch (Exception ex)
{
    if (ex.Message == "Specific message" || error) 
        // do something
    else
        throw ex;
}
new List<Action> {
    Func1,
    Func2
}.TakeWhile(action => {
    action();
    return _canContinue;
});