Как быстро проверить длину коллекции в C#

Имеется коллекция неизвестной длины (очень большой), например, N. Можно ли проверить, имеет ли она длину M, не перебирая все N элементов, т.е. не используя Count() или Length?

Например. Курсор идет по коллекции с начала в конец и считает, 1й, 2й, 3й, ..., M-2, M-1, ...! Идти по дальнейшим элементам, как делает Count(), не нужно!


Ответы (3 шт):

Автор решения: Chip Deep

С помощью метода Take() из LINQ можно перебрать только указанное число элементов

→ Ссылка
Автор решения: Alexander Petrov

Массивы в .NET имеют свойство Length, которое имеет сложность O(1). То есть при обращении к нему не будет перебора коллекции.

Коллекции в .NET, реализующие интерфейс IList<T> или ICollection<T> имеют свойство Count, которое тоже имеет сложность O(1). При его использовании перебора не будет.

И лишь последовательности IEnumerable<T> при использовании метода Count() будут перебираться. Сложность O(n). С этим ничего не поделаешь. Единственно, можно ограничить количество перебранных элементов с помощью метода Take(n).

Исходя из этого, если вам неизвестен тип коллекции (на входе IEnumerable), делайте приведение (кастинг) к ICollection - если приведение успешно, используйте свойство Count. Если неуспешно - значит это настоящий IEnumerable и перебор придётся делать. Напоминаю, можно ограничить его с помощью Take.

Для сведения: метод Count() внутри использует аналогичные проверки. Если он вызывается на ICollection/IList - его сложность будет O(1).


Каким образом вы приплели сюда работу с базами данных - вообще непонятно.

Как вам уже сказали в комментариях, запрос select count(id) from table использует индекс и перебора всей таблицы не будет.

→ Ссылка
Автор решения: Neomaster

Пример использования Take() для вашей задачи.

List<int> bigList = Enumerable.Range(0, 5000).ToList();

int lenght = 200;

bool hasLength = bigList
    .Take(lenght + 1)
    .Count() == lenght;
→ Ссылка