Хотя мне нравится LINQ, в нем есть некоторые дыры, например, эта проблема.
Выполнение подсчета в целом хорошо, но может стать проблемой, если для подсчета / извлечения элементов потребуется некоторое время.
Метод расширения Any () подойдет, если вы просто хотите проверить на наличие каких-либо, но если вы хотите проверить, по крайней мере, нет встроенной функции, которая сделает это и будет ленивой.
В конце я написал функцию, которая возвращает true, если в списке есть хотя бы определенное количество элементов.
public static bool AtLeast<T>(this IEnumerable<T> source, int number)
{
if (source == null)
throw new ArgumentNullException("source");
int count = 0;
using (IEnumerator<T> data = source.GetEnumerator())
while (count < number && data.MoveNext())
{
count++;
}
return count == number;
}
Для использования:
var query = bools.Where(b => b).AtLeast(2);
Преимущество заключается в том, что вам не нужно оценивать все элементы перед возвратом результата.
[Plug] Мой проект, NExtension содержит AtLeast, AtMost и переопределения, которые позволяют смешивать предикат с проверкой AtLeast / Most. [/ Штекер]