Eu amo string.IsNullOrEmpty
método. Eu adoraria ter algo que permita a mesma funcionalidade para IEnumerable. Existe tal? Talvez alguma classe auxiliar de coleta? A razão pela qual estou perguntando é que, nas if
declarações, o código parece confuso se o padrão é (mylist != null && mylist.Any())
. Seria muito mais limpo ter Foo.IsAny(myList)
.
Esta publicação não fornece a resposta: IEnumerable está vazio? .
c#
.net
linq
collections
ienumerable
Schultz9999
fonte
fonte
Respostas:
Claro que você poderia escrever isso:
no entanto, tenha cuidado para que nem todas as sequências sejam repetíveis; geralmente eu prefiro andar com eles apenas uma vez, só por precaução.
fonte
this
lá - considero métodos de extensão que se supõe serem chamadosnull
como um sinal de design feio..Any()
é um método de extensão que operaIEnumerable<T>
(ouIQueryable<T>
, embora esse seja um cenário diferente). Fazer isso consome a sequência , pelo menos parcialmente (embora isso ainda signifique que é consumido) - talvez seja necessário ler apenas um elemento (especialmente se não houver predicado). Como tal, como sequences (IEnumerable<T>
) não precisa ser repetível, pode ser isso .Any()
sem um predicado é essencialmente equivalente aforeach(var x in sequence) { return true; } return false;
- embora utilizeGetEnumerator()
etc, em vez de sintaxe compiladorfonte
IEnumerable
não temAny()
extensão.Aqui está uma versão modificada da resposta útil do @Matt Greer, que inclui uma classe de empacotador estático, para que você possa copiar e colar isso em um novo arquivo de origem, não depender do Linq e adicionar uma
IEnumerable<T>
sobrecarga genérica , para evitar o encaixe de tipos de valor isso ocorreria com a versão não genérica. [EDIT: Observe que o uso deIEnumerable<T>
não impede o encaixotamento do enumerador, a digitação com patos não pode impedir isso, mas pelo menos os elementos em uma coleção com valor de tipo não serão encaixotados.]fonte
Outra maneira seria obter o Enumerator e chamar o método MoveNext () para ver se há algum item:
Isso funciona para IEnumerable e IEnumerable <T>.
fonte
IEnumerable<T>
, como não genéricoIEnumerable
não implementaIDisposable
.Do jeito que eu faço isso, aproveitando alguns recursos modernos do C #:
Opção 1)
Opção 2)
E, a propósito, nunca use
Count == 0
ouCount() == 0
apenas para verificar se uma coleção está vazia. Sempre use Linq's.Any()
fonte
!
pode ser, especialmente na segunda opção;)Isso pode ajudar
fonte
A partir do C # 6, você pode usar a propagação nula :
myList?.Any() == true
Se você ainda achar isso muito entupido ou preferir um bom e velho método de extensão, eu recomendaria as respostas de Matt Greer e Marc Gravell, mas com um pouco de funcionalidade estendida para completar.
Suas respostas fornecem a mesma funcionalidade básica, mas cada uma de outra perspectiva. A resposta de Matt usa a
string.IsNullOrEmpty
mentalidade, enquanto a resposta de Marc segue o.Any()
caminho de Linq para fazer o trabalho.Pessoalmente, estou inclinado a usar a
.Any()
estrada, mas gostaria de adicionar a funcionalidade de verificação de condição da outra sobrecarga do método :Então você ainda pode fazer coisas como:
myList.AnyNotNull(item=>item.AnswerToLife == 42);
como você poderia fazer com a.Any()
verificação nula regular, mas com a adição nulaObserve que, com a maneira C # 6:
myList?.Any()
retorna a embool?
vez de abool
, que é o efeito real da propagação nulafonte
fonte
Aqui está o código da resposta de Marc Gravell , junto com um exemplo de como usá-lo.
Como ele diz, nem todas as seqüências são repetíveis, de modo que o código às vezes pode causar problemas, porque
IsAny()
começa a percorrer a sequência. Suspeito que a resposta de Robert Harvey significou que muitas vezes você não precisa procurarnull
e esvaziar. Freqüentemente, você pode simplesmente verificar se há nulo e depois usá-loforeach
.Para evitar iniciar a sequência duas vezes e aproveitar
foreach
, acabei de escrever um código como este:Eu acho que o método de extensão poupa algumas linhas de digitação, mas esse código parece mais claro para mim. Suspeito que alguns desenvolvedores não percebam imediatamente que
IsAny(items)
realmente começarão a percorrer a sequência. (Obviamente, se você estiver usando muitas seqüências, aprende rapidamente a pensar em quais etapas são necessárias.)fonte
Eu uso
Bool IsCollectionNullOrEmpty = !(Collection?.Any()??false);
. Espero que isto ajude.Demolir:
Collection?.Any()
retornaránull
se a coleção for nula efalse
se a coleção estiver vazia.Collection?.Any()??false
nos forneceráfalse
se a coleção estiver vazia efalse
se a coleção estivernull
.Complemento disso nos dará
IsEmptyOrNull
.fonte
O respondente de Jon Skeet ( https://stackoverflow.com/a/28904021/8207463 ) tem uma boa abordagem usando o Extension Method - Any () para NULL e EMPTY. MAS ele está validando o proprietário das perguntas no caso de NOT NULL. Portanto, mude cuidadosamente a abordagem de Jon para validar AS NULL para:
NÃO use (não validará como nulo):
Você também pode, em caso validar AS NOT NULL (não testado apenas como exemplo, mas sem erro do compilador) fazer algo assim usando predicado:
https://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,8788153112b7ffd0
Para qual versão do .NET você pode usá-lo, verifique:
https://docs.microsoft.com/en-us/dotnet/api/system.linq.enumerable.any?view=netframework-4.8#moniker-applies-to
fonte
Eu tive o mesmo problema e resolvo-o como:
"c => c! = null" ignorará todas as entidades nulas.
fonte
Eu construí esta off da resposta até @ Matt Greer
Ele respondeu à pergunta do OP perfeitamente.
Eu queria algo assim, mantendo os recursos originais de Any e também verificando se era nulo. Estou postando isso no caso de alguém precisar de algo semelhante.
Especificamente, eu ainda queria passar um predicado.
A nomeação do método de extensão provavelmente poderia ser melhor.
fonte
A outra melhor solução como abaixo para verificar vazio ou não?
fonte
listEnumerable
é nulo, que é a questão em apreçoEu uso este:
Ejem:
fonte
Como alguns recursos se esgotam após uma leitura, pensei por que não combinar as verificações e as leituras, em vez da verificação separada tradicional, e depois ler.
Primeiro, temos um para a extensão inline check-for-null mais simples:
Em seguida, temos o pouco mais envolvido (bem, pelo menos do jeito que escrevi), verifique se há uma extensão inline vazia e nula:
É claro que você ainda pode ligar para os dois sem continuar a cadeia de chamadas. Além disso, incluí o paramName, para que o responsável pela chamada possa incluir um nome alternativo para o erro, se a "origem" não estiver sendo verificada, por exemplo, "nameof (target)".
fonte
meu próprio método de extensão para verificar Não nulo e Qualquer
fonte
Sem auxiliares personalizados, eu recomendo
?.Any() ?? false
ou?.Any() == true
que são relativamente concisos e precisam especificar a sequência apenas uma vez.Quando quero tratar uma coleção ausente como uma coleção vazia, uso o seguinte método de extensão:
Essa função pode ser combinada com todos os métodos LINQ e
foreach
, não apenas.Any()
, é por isso que eu a prefiro sobre as funções auxiliares mais especializadas que as pessoas estão propondo aqui.fonte
eu uso
O resultado será nulo se não houver correspondência, caso contrário, retorna um dos objetos
Se você quisesse a lista, acredito que sair de First () ou chamar ToList () fornecerá a lista ou null.
fonte
Dê uma olhada nesta biblioteca de código- fonte aberto: Nzr.ToolBox
fonte
basta adicionar
using System.Linq
e ver a mágica acontecendo quando você tenta acessar os métodos disponíveis noIEnumerable
. Adicionando isso, você terá acesso ao método nomeadoCount()
tão simples quanto isso. lembre-se de verificarnull value
antes de ligarcount()
:)fonte
Eu usei simples se verificar
confira minha solução
fonte