Возможно ли, чтобы цикл "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)