Возможно ли, чтобы цикл 'foreach' имел проверку состояния? - PullRequest
20 голосов
/ 02 декабря 2010

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

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

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

    IEnumerable<Job> jobs = currentJobs;

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

Ответы [ 6 ]

19 голосов
/ 02 декабря 2010

Попробуйте использовать 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
        */
15 голосов
/ 02 декабря 2010

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

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

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

13 голосов
/ 22 декабря 2016

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

        foreach (var car in cars) if (!rentedCars.Contains(car))
        {
            // Magic
        }
11 голосов
/ 02 декабря 2010

Не очень люблю его, но, может быть, какой-то LINQ?

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

?

5 голосов
/ 02 декабря 2010

Правильно ли я понимаю, что у вас

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

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

foreach(var job in jobs.TakeWhile(x => someCondition(x)) { 
    someAction(job);
}
1 голос
/ 02 декабря 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...