Я люблю string.IsNullOrEmpty
метод. Я хотел бы иметь что-то, что позволило бы такую же функциональность для IEnumerable. Есть ли такие? Может быть, какой-нибудь вспомогательный класс коллекции? Причина, по которой я спрашиваю, состоит в if
том, что в операторах код выглядит загроможденным, если шаблон имеет значение (mylist != null && mylist.Any())
. Было бы намного чище иметь Foo.IsAny(myList)
.
Этот пост не дает такой ответ: IEnumerable пуст? ,
c#
.net
linq
collections
ienumerable
Schultz9999
источник
источник
Ответы:
Конечно, вы могли бы написать это:
Однако будьте осторожны, что не все последовательности повторяемы; как правило, я предпочитаю ходить только один раз, на всякий случай.
источник
this
- я считаю, что методы расширения, которые предполагается вызывать,null
являются признаком уродливого дизайна..Any()
- это метод расширения, который работаетIEnumerable<T>
(илиIQueryable<T>
, хотя это другой сценарий). Это потребляет последовательность , по крайней мере, частично (хотя это по-прежнему означает, что она используется) - может потребоваться прочитать только один элемент (особенно если нет предиката). Таким образом, поскольку sequence (IEnumerable<T>
) не нужно повторять, это может быть так .Any()
без предиката по существу эквивалентноforeach(var x in sequence) { return true; } return false;
- хотя он использует иGetEnumerator()
т. д. вместо синтаксиса компилятораисточник
IEnumerable
не имеетAny()
расширения.Вот модифицированная версия полезного ответа @Matt Greer, которая включает статический класс-обертку, так что вы можете просто скопировать и вставить это в новый исходный файл, не зависит от Linq, и добавляет универсальную
IEnumerable<T>
перегрузку, чтобы избежать упаковки типов значений это произойдет с неуниверсальной версией. [РЕДАКТИРОВАТЬ: обратите внимание, что использованиеIEnumerable<T>
не предотвращает упаковку перечислителя, это не может предотвратить утка , но, по крайней мере, элементы в коллекции с типизированным значением не будут упакованы.]источник
Другим способом было бы получить Enumerator и вызвать метод MoveNext (), чтобы увидеть, есть ли какие-либо элементы:
Это работает как для IEnumerable, так и для IEnumerable <T>.
источник
IEnumerable<T>
, поскольку неуниверсальноеIEnumerable
не реализуетсяIDisposable
.Как я это делаю, используя некоторые современные возможности C #:
Опция 1)
Вариант 2)
И, между прочим, никогда не используйте
Count == 0
илиCount() == 0
просто проверьте, если коллекция пуста. Всегда используйте Linq's.Any()
источник
!
может бытьЭто может помочь
источник
Начиная с C # 6 вы можете использовать нулевое распространение :
myList?.Any() == true
Если вы все еще находите это слишком забитым или предпочитаете хороший старый метод расширения, я бы порекомендовал ответы Мэтта Грира и Марка Гравелла, но с расширенной функциональностью для полноты.
Их ответы обеспечивают те же основные функции, но каждый с другой точки зрения. В ответе Мэтта используется
string.IsNullOrEmpty
-существимость, а в ответе Марка -.Any()
путь Линка, чтобы выполнить работу.Я лично склонен использовать
.Any()
дорогу, но хотел бы добавить функциональность проверки условий из другой перегрузки метода :Таким образом, вы все еще можете делать что-то вроде:
myList.AnyNotNull(item=>item.AnswerToLife == 42);
как вы могли бы с обычной,.Any()
но с добавленной нулевой проверкойОбратите внимание, что с помощью C # 6:
myList?.Any()
возвращаетbool?
скорее abool
, чем a , что является фактическим эффектом распространения nullисточник
источник
Вот код из ответа Марка Гравелла , а также пример его использования.
По его словам, не все последовательности повторяемы, так что код может иногда вызывать проблемы, потому что
IsAny()
начинается пошаговое выполнение последовательности. Я подозреваю, что имел в виду ответ Роберта Харви, что вам часто не нужно проверятьnull
и опорожнять. Часто вы можете просто проверить на ноль, а затем использоватьforeach
.Чтобы не запускать последовательность дважды и воспользоваться преимуществами
foreach
, я просто написал такой код:Я предполагаю, что метод расширения экономит вам пару строк при наборе текста, но этот код кажется мне более понятным. Я подозреваю, что некоторые разработчики не сразу поймут, что на
IsAny(items)
самом деле начнут шагать по последовательности. (Конечно, если вы используете много последовательностей, вы быстро научитесь думать, какие шаги через них проходят.)источник
я использую
Bool IsCollectionNullOrEmpty = !(Collection?.Any()??false);
. Надеюсь это поможет.Сломать:
Collection?.Any()
вернется,null
если Collection имеет значение null, иfalse
если Collection пуст.Collection?.Any()??false
даст нам,false
если коллекция пуста, иfalse
если коллекцияnull
.Дополнение тому даст нам
IsEmptyOrNull
.источник
Anwser Джона Скита ( https://stackoverflow.com/a/28904021/8207463 ) имеет хороший подход с использованием метода расширения - Any () для NULL и EMPTY. НО он проверяет владельца вопросов в случае НЕ НУЛЬ. Поэтому тщательно измените подход Джона, чтобы проверить, как NULL:
НЕ используйте (не проверяет как NULL):
Вы также можете в случае проверки AS NOT NULL (НЕ протестировано в качестве примера, но без ошибки компилятора) сделать что-то вроде использования предиката:
https://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,8788153112b7ffd0
Для какой версии .NET вы можете его использовать, проверьте:
https://docs.microsoft.com/en-us/dotnet/api/system.linq.enumerable.any?view=netframework-4.8#moniker-applies-to
источник
У меня была такая же проблема, и я решаю ее так:
«c => c! = null» будет игнорировать все нулевые объекты.
источник
Я построил это из ответа @Matt Greer
Он отлично ответил на вопрос ОП.
Я хотел что-то подобное, сохраняя при этом исходные возможности Any, а также проверяя на ноль. Я публикую это на тот случай, если кому-то еще понадобится нечто подобное.
В частности, я хотел все еще быть в состоянии передать предикат.
Наименование метода расширения может быть лучше.
источник
Другое лучшее решение, как ниже, чтобы проверить пусто или нет?
источник
listEnumerable
NULL, что вопрос под рукойЯ использую это:
Ejem:
источник
Поскольку некоторые ресурсы исчерпываются после одного чтения, я подумал, почему бы не объединить проверки и чтения вместо традиционной отдельной проверки, а затем прочитать.
Сначала у нас есть один для более простого встроенного расширения check-for-null:
Тогда нам нужно немного больше (ну, по крайней мере, так, как я написал) встроенное расширение check-for-null-and-empty:
Конечно, вы можете звонить обоим без продолжения цепочки вызовов. Кроме того, я включил paramName, чтобы вызывающая сторона могла включить альтернативное имя для ошибки, если она не проверяется как «источник», например, «nameof (target)».
источник
мой собственный метод расширения, чтобы проверить Не нуль и Любой
источник
Без пользовательских помощников я рекомендую либо
?.Any() ?? false
или?.Any() == true
которые относительно краткие и только нужно указать последовательность раз.Когда я хочу обработать отсутствующую коллекцию как пустую, я использую следующий метод расширения:
Эту функцию можно комбинировать со всеми методами LINQ, и
foreach
не только.Any()
, поэтому я предпочитаю ее более специализированным вспомогательным функциям, которые здесь предлагают.источник
я использую
Результат будет нулевым, если нет совпадений, в противном случае возвращается один из объектов
Если вы хотите получить список, я полагаю, что выход из First () или вызов ToList () предоставит список или пустое значение.
источник
Взгляните на эту библиотеку с открытым исходным кодом: Nzr.ToolBox
источник
просто добавьте
using System.Linq
и увидите магию, происходящую при попытке доступа к доступным методам вIEnumerable
. Добавление этого даст вам доступ к методу, названномуCount()
так просто. просто не забудьте проверитьnull value
перед звонкомcount()
:)источник
Я использовал простой, если проверить это
проверить мое решение
источник