Я обсуждал это с коллегами, и мы не могли понять, какая польза от них .Any
для List<>
C #.
Вы можете проверить правильность элемента в массиве, как следующий оператор:
if (MyList.Any()){ ...} //Returns true or false
Что точно так же, как
if (MyList.Count() != 0) { ... }
и является гораздо более распространенным, читаемым и понятным о намерении if
утверждения.
В итоге мы застряли с этой мыслью:
.Any()
может использоваться, будет работать так же хорошо, но менее ясно о намерениях программиста, и в этом случае его не следует использовать.
Но мы чувствуем, что это не может быть правдой; мы должны что-то упустить.
Мы?
Any()
которое менее ясно:Any()
мне кажется более ясным, особенно с лямбда-условием. Переводя код на английский у меня в голове,if(MyList.Count(o => o > 10) > 0)
становится "Количество предметов больше 10 больше 0?" тогда какif(MyList.Any(o => o > 10))
становится "Есть ли предметы больше 10?"Any
естьExists
. Имя Linq, вероятно, больше вдохновлено Haskell и Python, которые также имеют любые / все функции.Ответы:
Имейте в виду, что
Any
не работает наList
; он действует на объектIEnumerable
, который представляет конкретный тип, который может иметь или не иметьCount
свойство. Это правда, что это не обязательно лучшая вещь для использованияList
, но она определенно пригодится в конце запроса LINQ. И даже более полезным, чем автономная версия, является переопределение, которое принимает предикат так же, какWhere
. Нет ничегоList
более удобного и выразительного, чемAny
метод расширения предикатов .Кроме того, если вы используете
Count()
(метод расширения LINQ для IEnumerable), а неCount
(свойство onList
), ему может потребоваться перечислить всю последовательность, если он не может ее оптимизировать, обнаружив, что ваш базовый тип данных имеетCount
свойство , Если у вас длинная последовательность, это может быть заметным ударом по производительности, когда вы не очень задумываетесь о том, что такое счетчик, а просто хотите узнать, есть ли какие-либо элементы в коллекции.источник
Any()
с предикатом более выразительно, чем сравнение переопределения,Enumerable.Count()
которое требует предикат с 0. :)Exists
так же удобно и выразительно, какAny
и с предикатом. ИспользованиеCount != 0
свойства дляList
более нормально, чем использованиеAny()
. Это просто личное предпочтение. Я также прошел через усилие изменения_list_.Count()
в_list_.Count
в коде моей группы. Это сделало заметную разницу для меня.Разница во времени выполнения
Count()
может быть O (n), гдеAny()
O (1).источник
Count()
также не будет останавливаться для бесконечных итераторов, покаAny()
будет, так как он должен вызыватьсяMoveNext()
только один раз.Any(Func<T>)
это O (n)List
производительность одинакова, поскольку расширение использует это свойство. Правда для всех коллекций, реализующихICollection
интерфейс.На самом деле, имейте в виду, что есть свойство List.Count , а затем есть метод Enumerable.Count .
В вашем примере вы используете
Enumerable.Count()
метод, который должен перебирать каждый элемент перечисления, чтобы вернуть результат. Это явно медленнее, чем вызов,Any()
который должен перебирать только первый элемент, если он существует.РЕДАКТИРОВАТЬ:
В комментариях было правильно указано, что
Enumerable.Count()
методу расширения не нужно перебирать все элементы, если он обнаруживает, что перечислимое также оказываетсяICollection<T>
. Так что в случаеList<T>
использования использованиеCount
свойства или метода на самом деле не имеет значения.Источник IEnumerable.Count :
источник
List<T>
этом разница в производительности будет незначительной. Так что просто используйте то, что вы предпочитаете. Но для других типов IEnumerables вы можете выбирать толькоCount()
(метод), иAny()
, и в этом случае,Any()
всегда будете явным победителем в вашем случае использования, и его следует отдавать предпочтение. Для чего это стоит, я думаюAny()
, вполне читабельно и понятно.Count()
имеет ту же сложность, что иCount
дляICollection
s, так как метод расширения затем использует свойство вместо итерации.Удивительный вопрос - я считаю, что намерение
list.Any()
гораздо яснее, чем намерениеlist.Count()!=0
.Намерение означает: если вы читаете чей-то код (а вы сами его не писали), совершенно ли очевидно, чего хочет достичь программист и почему он написан так, как он написан? Если обычная проблема решается излишне сложным способом, вы сразу же начинаете подозревать и удивляться, почему разработчик не использовал этот простой способ. Вы просматриваете код и пытаетесь понять, что вы что-то упустили. Вы боитесь изменить код, потому что вы беспокоитесь, что есть какой-то побочный эффект, который вам не хватает, и изменение может вызвать непредвиденные проблемы.
Цель использования
Any()
метода совершенно ясна - вы хотите знать, есть ли какие-либо элементы в списке или нет.С
Count()!=0
другой стороны, смысл выражения не очевиден для читателя. Конечно, нетрудно увидеть, что выражение говорит вам, если список пуст или нет. Вопросы возникают потому, что вы пишете именно таким образом, а не используя стандартный метод. Почему вы используетеCount()
явно? Если вам действительно нужно знать, есть ли какие-либо элементы в списке, почему вы хотите сначала сосчитать весь список? Как только вы достигнете 1, у вас уже есть ответ. Если источник был итератором для большой (возможно, бесконечной) коллекции или был переведен в sql, это могло бы сильно повлиять на производительность. Так что, может быть, явное использование Count () для принудительного выполнения отложенного запроса или для обхода итератора?Но источник на самом деле ,
List<T>
гдеCount()
есть O (1) и не имеет побочных эффектов. Но если код опирается на это свойствоList<T>
, то почему бы не использоватьCount
-property, который более четко указывает на то, что вы ожидаете операцию O (1) без побочных эффектов?Как написано, он
list.Count()!=0
делает то же самое, что иlist.Any()
он, без необходимости, более сложен, а цель неясна.источник
Count()
имеет подразумеваемое преобразование, которое я бы избегал использовать, но это не ясно. Компилятор может оптимизировать его, что делает его неосторожным кодированием.Может это просто слово?
Any
это прилагательное, на самом деле ничего не говоря. Исходя из Java, я бы назвал это,isNonEmpty
который содержит глагол. Парень SQL может предпочестьEXISTS
. Но, возможно,Any
лучше всего подходит в системе C #.Каким бы ни было слово «выбор», как только вы к нему привыкнете, оно должно быть понятнее. Вы спросите: "Остались ли
more than zero
пивные бутылки"? Вы ожидаете, чтоone or more
люди начнут считать их прежде, чем они ответят "Нет, нетany
"?источник
Any()
это действительно сокращение дляAny(o => true)