gpt4 book ai didi

c# - List ForEach 休息

转载 作者:可可西里 更新时间:2023-11-01 03:06:07 29 4
gpt4 key购买 nike

有没有办法突破 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# - List ForEach 休息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3145563/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com