Перечислите повреждение ForEach

существует ли способ убежать из foreach дополнительного метода? Ключевое слово "повреждения" не распознает, что дополнительный метод как допустимый объем повреждается от.

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

Править: удаленный "linq" от вопроса


обратите внимание, что код является просто примером для показа повреждения, не работающего в дополнительном методе... действительно, что я хочу, чтобы пользователь смог прервать обработку списка.. поток UI имеет переменную аварийного прекращения работы, и для цикла просто повреждается, когда пользователь поражает кнопку отмены. Прямо сейчас у меня есть нормальное для цикла, но я хотел видеть, было ли возможно сделать с дополнительным методом.

16
задан tbischel 30 June 2010 в 00:22
поделиться

3 ответа

Вероятно, правильнее было бы назвать это 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;}
    });
17
ответ дан 30 November 2019 в 17:27
поделиться

Почему бы не использовать Где ?

Enumerable.Range(0, 10).Where(i => i <= 2).ToList().ForEach(...)
3
ответ дан 30 November 2019 в 17:27
поделиться

Я рекомендую использовать 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()));
11
ответ дан 30 November 2019 в 17:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: