существует ли способ убежать из foreach дополнительного метода? Ключевое слово "повреждения" не распознает, что дополнительный метод как допустимый объем повреждается от.
//Doesn't compile
Enumerable.Range(0, 10).ToList().ForEach(i => { System.Windows.MessageBox.Show(i.ToString()); if (i > 2)break; });
Править: удаленный "linq" от вопроса
обратите внимание, что код является просто примером для показа повреждения, не работающего в дополнительном методе... действительно, что я хочу, чтобы пользователь смог прервать обработку списка.. поток UI имеет переменную аварийного прекращения работы, и для цикла просто повреждается, когда пользователь поражает кнопку отмены. Прямо сейчас у меня есть нормальное для цикла, но я хотел видеть, было ли возможно сделать с дополнительным методом.
Вероятно, правильнее было бы назвать это List
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;
}
}
}
Затем вы можете переписать свой код следующим образом
Enumerable.Range(0,10)
.ForEach((int i,ref bool doBreak) => {
System.Windows.MessageBox.Show(i.ToString());
if ( i > 2) {doBreak = true;}
});
Почему бы не использовать Где
?
Enumerable.Range(0, 10).Where(i => i <= 2).ToList().ForEach(...)
Я рекомендую использовать TakeWhile .
Enumerable.Range(0, 10).TakeWhile(i => i <= 2).ToList().ForEach(i => MessageBox.Show(i.ToString()));
Или, используя Rx :
Enumerable.Range(0, 10).TakeWhile(i => i <= 2).Run(i => MessageBox.Show(i.ToString()));