Когда я хочу что-то сделать со списком, я сначала проверяю его, если он не 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 *....