Подтвердить что ты не робот

Список <T> Любой или граф?

Когда я хочу что-то сделать со списком, я сначала проверяю его, если он не null или не содержит элементов (не взорвать foreach), и я обычно использую list.Any(), но лучший вариант - используйте list.Count > 0 или используйте list.Any()?

4b9b3361

Ответ 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 *....