Возможно ли, чтобы цикл "foreach" имел проверку состояния?

Если у меня есть цикл foreach, есть ли способ проверить также логическое значение?

Я не хочу проверять один раз внутри foreach(), а затем, например, ломаться. Я хочу foreach над коллекцией и в то же время оценить, если что-то истинно.

Например, я не хочу делать:

    IEnumerable<Job> jobs = currentJobs;

    foreach(Job job in jobs)
    {
        if (found) 
            break;
    }

Ответы

Ответ 1

Вы всегда можете превратить его в цикл for.

for (i = 0; i < jobs.Count && booleanTrue; i++) {
 // do a lot of great stuff
}

Вам также нужно будет изменить задания от IEnumerable до IList. Я думаю, что IList будет служить вашим целям лучше. IEnumerable lazy оценивает элементы непосредственно перед их использованием и не включает связанные вспомогательные методы сбора.

Ответ 2

Попробуйте использовать TakeWhile.

Из примера:

    string[] fruits = { "apple", "banana", "mango", "orange", 
                          "passionfruit", "grape" };

    IEnumerable<string> query =
        fruits.TakeWhile(fruit => String.Compare("orange", fruit, true) != 0);

    foreach (string fruit in query)
    {
        Console.WriteLine(fruit);
    }

        /*
         This code produces the following output:

         apple
         banana
         mango
        */

Ответ 3

Не очень любя его, но, возможно, LINQ?

bool yourBool = false;
foreach(var item in
    collection.TakeWhile(x => yourBool))
{...}

?

Ответ 4

Я нашел другой подход:

        foreach (var car in cars) if (!rentedCars.Contains(car))
        {
            // Magic
        }

Ответ 5

Я правильно понимаю, что вы

  • имеют последовательность элементов
  • хотите выполнить некоторые действия с каждым элементом
  • но вы хотите разбить первый элемент, с которым вы сталкиваетесь, для которого выполняется какое-либо условие?

Я не понимаю сопротивления использованию петель foreach; Я бы либо придерживался того, что у вас есть, либо

foreach(var job in jobs.TakeWhile(x => someCondition(x)) { 
    someAction(job);
}

Ответ 6

Нет, foreach просто работает для каждого элемента.

Вы можете комбинировать несколько условий в регулярном цикле for(a; b; c). Как for(a; b && x; c)