У меня есть List<bool>
с большим количеством значений. Каков наиболее эффективный способ проверить, равен ли каждый отдельный элемент в списке false
?
Bool list проверяет, является ли каждый элемент в списке ложным
Ответ 1
Вы можете использовать Enumerable.Any
, который будет удовлетворять условию первого совпадения. Как Хабиб правильно сказал лучше использовать Any как Enumerable. Все вернет true для пустого списка bool.
!lst.Any(c=> c == true);
ИЛИ использовать Enumerable.All
lst.All(c=> c == false);
Ответ 2
Я согласен с использованием IEnumerable.Any/Все. Тем не менее, я не согласен с большинством голосов (что было неправильно на момент написания этого) и несколькими связанными комментариями Any vs All.
Следующие операции эквивалентны семантически. Обратите внимание, что отрицания применяются как внутри, так и по предикату и по результату операции.
!l.Any(x => f(x))
l.All(x => !f(x))
Теперь в этом случае мы ищем:
Если это не так, то есть истинное значение.
!l.Any(x => x) // f(x) = x == true
Или
В этом случае каждое значение не соответствует действительности.
l.All(x => !x) // f'(x) = !f(x) = !(x == true)
Нет ничего особенного для пустых списков, результат один и тот же: например. !empty.Any(..)
является ложным, как и empty.All(..)
, и приведенное выше отношение эквивалентности остается в силе.
Кроме того, обе формы оцениваются лениво и требуют одинакового количества оценок в LINQ To Objects; внутренне разница для реализации последовательности просто отрицает проверку предиката и значение результата.
Ответ 3
Вы можете использовать метод LINQ's
All
:
list.All(x => x == false);
Это вернет false
немедленно, если оно найдет значение, равное true
.