在正常循环中,您可以使用break中断循环.可以使用匿名代表完成相同的操作吗?
示例inputString和result都在委托之外声明.
blackList.ForEach(new Action( delegate(string item) { if(inputString.Contains(item)==true) { result = true; // I want to break here } } ));
编辑:感谢您的回复,我实际上是在约翰那时读你的书:)为了记录,我点击这个问题并切换回正常的foreach循环,但我发布了这个问题,看看我是否错过了什么.
正如其他人发布的那样,你无法退出ForEach中的循环.
你能使用LINQ吗?如果是这样,您可以轻松地将TakeWhile和自定义ForEach扩展方法结合起来(几乎每个项目似乎都有这些日子).
但是,在你的例子中,List
这将是最好的选择 - 但如果你实际上没有这样做,请发一个你真正想做的事情的例子.
没有可以访问的循环,从中可以断开.每次调用(匿名)委托都是一个新的函数调用,因此局部变量无济于事.但是由于C#给你一个闭包,你可以设置一个标志,然后在进一步的调用中什么都不做:
bool stop = false; myList.ForEach((a) => { if (stop) { return; } else if (a.SomeCondition()) { stop = true; } });
(这需要进行测试以检查是否生成了关闭的正确引用语义.)
更高级的方法是创建自己的扩展方法,允许委托返回false以停止循环:
static class MyExtensions { static void ForEachStoppable(this IEnumerable input, Func action) { foreach (T t in input) { if (!action(t)) { break; } } } }
你有LINQ可用吗?你的逻辑似乎与Any相似:
bool any = blackList.Any(s=>inputString.Contains(s));
这与:
bool any = blackList.Any(inputString.Contains);
如果你没有LINQ,那么这仍然是:
bool any = blackList.Find(inputString.Contains) != null;
如果你想运行额外的逻辑,你可以做些事情(使用LINQ)TakeWhile
等
在使用ForEach方法时,我认为没有一种优雅的方法.一个hacky解决方案是抛出异常.
什么阻止你做一个老式的foreach?
foreach (string item in blackList) { if (!inputString.Contains(item)) continue; result = true; break; }