Me encanta el string.IsNullOrEmpty
método Me encantaría tener algo que permita la misma funcionalidad para IEnumerable. ¿Hay tal? Tal vez alguna clase de ayuda de colección? La razón por la que pregunto es que en las if
declaraciones, el código parece desordenado si el patrón lo es (mylist != null && mylist.Any())
. Sería mucho más limpio tenerlo Foo.IsAny(myList)
.
Esta publicación no da esa respuesta: ¿ IEnumerable está vacío? .
c#
.net
linq
collections
ienumerable
Schultz9999
fuente
fuente
Respuestas:
Claro que podrías escribir eso:
sin embargo, tenga cuidado de que no todas las secuencias sean repetibles; generalmente prefiero caminar solo una vez, por si acaso.
fuente
this
allí: considero los métodos de extensión que se supone que se invocannull
como un signo de diseño feo..Any()
es un método de extensión que funcionaIEnumerable<T>
(oIQueryable<T>
, aunque ese es un escenario diferente). Hacerlo consume la secuencia , al menos parcialmente (aunque eso todavía significa que se consume), es posible que solo necesite leer un elemento (especialmente si no hay un predicado). Como tal, dado que las secuencias (IEnumerable<T>
) no necesitan ser repetibles, eso podría ser .Any()
sin un predicado es esencialmente equivalente aforeach(var x in sequence) { return true; } return false;
- aunque usaGetEnumerator()
etc en lugar de la sintaxis del compiladorfuente
IEnumerable
no tieneAny()
extensión.Aquí hay una versión modificada de la útil respuesta de @Matt Greer que incluye una clase de envoltura estática para que pueda copiar y pegar esto en un nuevo archivo fuente, no depende de Linq y agrega una
IEnumerable<T>
sobrecarga genérica , para evitar el encajonamiento de los tipos de valores eso ocurriría con la versión no genérica. [EDITAR: tenga en cuenta que el uso deIEnumerable<T>
no impide el encajonamiento del enumerador, el tipeo de pato no puede evitar eso, pero al menos los elementos en una colección de tipo tipado no estarán encuadrados.]fuente
Otra forma sería obtener el enumerador y llamar al método MoveNext () para ver si hay algún elemento:
Esto funciona tanto para IEnumerable como para IEnumerable <T>.
fuente
IEnumerable<T>
, yaIEnumerable
que no se implementa no genéricoIDisposable
.Como lo hago, aprovechando algunas características modernas de C #:
Opción 1)
Opcion 2)
Y, por cierto, nunca use
Count == 0
oCount() == 0
solo para verificar si una colección está vacía. Siempre use Linq's.Any()
fuente
!
puede ser el operador de negación , especialmente en la segunda opción;)Esto puede ayudar
fuente
Comenzando con C # 6, puede usar propagación nula :
myList?.Any() == true
Si todavía encuentra esto demasiado atascado o prefiere un buen método de extensión, recomendaría las respuestas de Matt Greer y Marc Gravell, pero con un poco de funcionalidad extendida para completar.
Sus respuestas proporcionan la misma funcionalidad básica, pero cada una desde otra perspectiva. La respuesta de Matt usa la
string.IsNullOrEmpty
-mentalidad, mientras que la respuesta de Marc toma el.Any()
camino de Linq para hacer el trabajo.Personalmente, me inclino a usar el
.Any()
camino, pero me gustaría agregar la funcionalidad de verificación de condición de la otra sobrecarga del método :Por lo tanto, aún puede hacer cosas como:
myList.AnyNotNull(item=>item.AnswerToLife == 42);
como podría hacerlo.Any()
con la verificación nula normal pero agregadaTenga en cuenta que con la forma C # 6:
myList?.Any()
devuelve un enbool?
lugar de unbool
, que es el efecto real de propagar nulofuente
fuente
Aquí está el código de la respuesta de Marc Gravell , junto con un ejemplo de uso.
Como él dice, no todas las secuencias son repetibles, por lo que el código a veces puede causar problemas, porque
IsAny()
comienza a recorrer la secuencia. Sospecho que la respuesta de Robert Harvey fue que a menudo no es necesario verificarnull
y vaciar. A menudo, puede verificar si es nulo y luego usarloforeach
.Para evitar comenzar la secuencia dos veces y aprovechar
foreach
, acabo de escribir un código como este:Supongo que el método de extensión le ahorra un par de líneas de escritura, pero este código me parece más claro. Sospecho que algunos desarrolladores no se darían cuenta de inmediato de que
IsAny(items)
realmente comenzarán a recorrer la secuencia. (Por supuesto, si está utilizando muchas secuencias, aprende rápidamente a pensar qué pasos debe seguir).fuente
Yo uso
Bool IsCollectionNullOrEmpty = !(Collection?.Any()??false);
. Espero que esto ayude.Descompostura:
Collection?.Any()
regresaránull
si la Colección es nula yfalse
si la Colección está vacía.Collection?.Any()??false
nos daráfalse
si la Colección está vacía, yfalse
si la Colección está vacíanull
.Complemento de eso nos dará
IsEmptyOrNull
.fuente
La respuesta de Jon Skeet ( https://stackoverflow.com/a/28904021/8207463 ) tiene un buen enfoque utilizando el Método de extensión - Any () para NULL y EMPTY. PERO está validando el propietario de las preguntas en caso de NO NULL. Así que cambie cuidadosamente el enfoque de Jon para validar AS NULL para:
NO use (no validará como NULL):
También puede en caso de validar AS NOT NULL (NO probado solo como ejemplo pero sin error del compilador) hacer algo como usar predicado:
https://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,8788153112b7ffd0
Para qué versión de .NET puede usar, verifique:
https://docs.microsoft.com/en-us/dotnet/api/system.linq.enumerable.any?view=netframework-4.8#moniker-applies-to
fuente
Tuve el mismo problema y lo resuelvo como:
"c => c! = null" ignorará todas las entidades nulas.
fuente
Construí esto a partir de la respuesta de @Matt Greer
Él respondió la pregunta del OP perfectamente.
Quería algo como esto mientras mantenía las capacidades originales de Any mientras también comprobaba null. Estoy publicando esto en caso de que alguien más necesite algo similar.
Específicamente, todavía quería poder pasar un predicado.
El nombramiento del método de extensión probablemente podría ser mejor.
fuente
¿La otra mejor solución como la siguiente para marcar vacío o no?
fuente
listEnumerable
es nulo, que es la pregunta en cuestiónYo uso este:
Ejem:
fuente
Dado que algunos recursos se agotan después de una lectura, pensé por qué no combinar los cheques y las lecturas, en lugar del cheque separado tradicional, luego leer.
Primero tenemos uno para la extensión en línea más simple check-for-null:
Luego tenemos el poco más involucrado (bueno, al menos la forma en que lo escribí) extensión en línea check-for-null-and-empty:
Por supuesto, aún puede llamar a ambos sin continuar la cadena de llamadas. Además, incluí el paramName, de modo que la persona que llama puede incluir un nombre alternativo para el error si no se está comprobando "fuente", por ejemplo, "nombrede (destino)".
fuente
mi propio método de extensión para marcar No nulo y Cualquiera
fuente
Sin ayudantes personalizados recomiendo ya sea
?.Any() ?? false
o?.Any() == true
lo que es necesidad relativamente concisa y sólo para especificar la secuencia de una vez.Cuando quiero tratar una colección faltante como una colección vacía, utilizo el siguiente método de extensión:
Esta función se puede combinar con todos los métodos LINQ y
foreach
, no solo.Any()
, es por eso que la prefiero a las funciones auxiliares más especializadas que la gente propone aquí.fuente
yo suelo
El resultado será nulo si no coincide, de lo contrario devuelve uno de los objetos
Si quería la lista, creo que dejar First () o llamar a ToList () proporcionará la lista o será nula.
fuente
Eche un vistazo a esta biblioteca de código abierto : Nzr.ToolBox
fuente
simplemente agregue
using System.Linq
y vea la magia que ocurre cuando intenta acceder a los métodos disponibles en elIEnumerable
. Agregar esto le dará acceso al método nombradoCount()
tan simple como eso. solo recuerde verificarnull value
antes de llamarcount()
:)fuente
Solía simple si para verificarlo
mira mi solución
fuente