Est-ce que C# ont IsNullOrEmpty pour la Liste/IEnumerable?
Je sais que généralement la Liste vide est plus préfèrent que NULL. Mais je vais retourner NULL, principalement pour deux raisons
- J'ai vérifier et traiter les valeurs nulles explicitement, en évitant les bugs et les attaques.
- Il est facile à réaliser
??
opération par la suite pour obtenir une valeur de retour.
Pour les chaînes, nous avons IsNullOrEmpty. Est-il rien de à partir de C# lui-même faire la même chose pour la Liste ou IEnumerable?
- Non, mais l'ajout d'une méthode d'extension est triviale.
- double possible de Comment vérifier si IEnumerable est null ou vide?
Vous devez vous connecter pour publier un commentaire.
rien de cuit dans le cadre, mais il est assez simple de la méthode d'extension.
Voir ici
Daniel Vaughan prend l'étape supplémentaire de casting pour ICollection (si possible) pour des raisons de performances. Quelque chose que je n'aurais pas pensé à le faire.
enumerable.Any()
peut perdre un élément de non-rebobinables énumération. Vous pouvez l'envelopper dans quelque chose qui va garder une trace de ce premier élément (et de gérer la valeur null gentiment, bien sûr, ou nous inversons l'OP de l'ensemble de la question), mais il peut être pratique dans certains cas, à se fondre avec un vide de l'énumération et de n'utiliser que le résultat.return !enumerable.Any();
? Je vais le modifier.ICollection
, depuis unIEnumerable<Animal>
pourrait être quelque chose comme une instance deList<Cat>
, ce qui ne permet pas de mettre en œuvreICollection<Animal>
mais ne mettre en œuvre non génériqueICollection
?Any()
. Bien qu'il est toujours une bonne idée de jeter de sorte que vous pouvez éviter laGetEnumerator
etMoveNext
code sous le capot lors de l'appel deAny
.IReadOnlyCollection
(ce qui ne signifie pas héritent de ICollection).ICollection.Count
O(1) etIEnumerable.Count()
O(n)? J'comprendre le dernier, mais pourquoi est un simple cast assez pour le faire O(1)?La fin de la mise à jour: depuis C# 6.0, la null-propagation de l'opérateur peut être utilisé pour exprimer concis comme ceci:
Note 1:
?? false
est nécessaire, pour la raison suivante (résumé/citation de ce post):Note 2: comme un bonus, cette déclaration est "thread-safe" (citation de la réponse de cette question):
Il n'y a rien de construit dans.
C'est une simple extension de la méthode bien que:
Si vous avez besoin d'être en mesure de récupérer tous les éléments dans le cas de la non-vide, alors quelques réponses ici ne fonctionne pas, parce que l'appel à
Any()
sur un non-rebobinables énumérable va "oublier" un élément.Vous pouvez prendre une approche différente et tourner les valeurs null dans le vide:
De même
(someEnumeration ?? Enumerable.Empty<MyType>()).ToList()
etc. peut être utilisé.foreach(var item in someQueryable)
permettrait de générer ses propres eneumerator, et puis nesomeQueryable.Any()
serait une autre requête et ne pas affecter le courant de l'énumérateur foreach autant que je sache.IEnumerable
alors encore plus alors que la requête a été perdu.Que tout le monde l'a dit, rien n'est intégré dans le cadre, mais si vous utilisez le Château, puis le Château.De base.Interne de l'a.
Mettre ensemble les réponses précédentes en une simple extension de la méthode pour C# 6.0+:
J'ai modifié la suggestion de Matthieu Vignes pour éviter le "Possible plusieurs énumération de IEnumerable" - problème.
(voir aussi le commentaire de Jon Hanna)
... et de l'unité de test:
pour moi le meilleur isNullOrEmpty méthode est regardé comme cette