Как быстро проверить длину коллекции в C#
Имеется коллекция неизвестной длины (очень большой), например, N. Можно ли проверить, имеет ли она длину M, не перебирая все N элементов, т.е. не используя Count() или Length?
Например. Курсор идет по коллекции с начала в конец и считает, 1й, 2й, 3й, ..., M-2, M-1, ...! Идти по дальнейшим элементам, как делает Count(), не нужно!
Ответы (3 шт):
С помощью метода Take() из LINQ можно перебрать только указанное число элементов
Массивы в .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 использует индекс и перебора всей таблицы не будет.
Пример использования Take() для вашей задачи.
List<int> bigList = Enumerable.Range(0, 5000).ToList();
int lenght = 200;
bool hasLength = bigList
.Take(lenght + 1)
.Count() == lenght;