Когда я хочу что-то сделать со списком, я сначала проверяю его, если он не null или не содержит элементов (не взорвать foreach), и я обычно использую list.Any(), но лучший вариант - используйте list.Count > 0 или используйте list.Any()?
Список <T> Любой или граф?
Ответ 1
- Используйте
Countесли вы используетеList, так как он знает его размер. - Использовать
LengthдляArray - Если у вас просто
IEnumerableя бы использовал.Any().Count()как он будет быстрее, так как останавливается после проверки одного элемента.
Также проверьте этот вопрос: Какой метод работает лучше:.Any() vs.Count()> 0?
Ответ 2
Я использую list.Count > 0 только потому, что он не зависит от методов LINQ и поэтому работает на С# 2.0.
Я лично избегаю LINQ, как чума (из-за ее медленной скорости), и там вообще нет причин использовать методы расширения вообще.
Однако, лучшим решением будет, вероятно, сделать вашу собственную версию Any, которая будет использоваться в null ссылке, и вернуть true, если это коллекция с элементами. Это сэкономит вам нулевую проверку.
Ответ 3
.Any() обычно лучше использовать, чем .Count() > 0. Причина этого в том, что если элементы, которые вы перебираете, не являются ICollection то для получения счетчика придется выполнить итерацию всего списка.
Но если элементы представляют собой ICollection (что представляет собой List<T>), то использовать Count() (Any() итеративно один раз независимо от базового типа в MS.Net, а в некоторых случаях быстрее Count() но Mono пытается оптимизировать это, чтобы ICollection Count > 0 когда базовые элементы являются ICollection)
Отличным инструментом является Reflector, исходный код .Net и исходный код Mono, который позволяет увидеть, как все реализовано.
Ответ 4
Если вы используете платформу Entity Framework и имеете огромную таблицу со многими записями Any(), она будет намного быстрее. Я помню один раз, когда я хотел проверить, была ли таблица пустой, и у нее было миллионы строк. Для завершения Count() > 0 потребовалось 20-30 секунд. Это было мгновенно с Any().
Ответ 5
В массиве вы должны использовать .Count(), а не .Count, но .Any() работает для обоих, поэтому я предпочитаю это, поскольку он читает бит более четким при проверке .Count() > 0.
Ответ 6
Any() может повысить производительность, потому что может не потребоваться повторять коллекцию, чтобы получить количество вещей. Это просто должно ударить одного из них. Или, скажем, для LINQ-to-Entities, сгенерированный SQL будет IF EXISTS (...), а не SELECT COUNT... или даже SELECT *....