De retour à zéro pour Count() sur la valeur null IEnumerables
Je suis fatigué d'utiliser le code comme ceci:
var count = 0;
if (myEnumerable != null)
{
count = myEnumerable.Count();
}
Et c'est un peu pédant:
var count = (myEnumerable ?? new string[0]).Count();
Est-il plus propre façon de faire cela? Une fois, j'ai eu la (mal nommée) PhantomCount méthode d'extension sur IEnumerable<> qui a utilisé mon premier exemple de code, mais il avait quelque chose de l'odeur sur elle (en plus le nom).
Vous devez vous connecter pour publier un commentaire.
Le problème est vraiment dans tout ce qui est de la création de ces enumerables. Sauf si vous avez une très bonne raison, tout ce qui génère un objet iterable collection doit retourner un vide de la collection au lieu de
null
. Cela permettrait d'harmoniser avec la Null-Objet-Modèle, d'où les avantages sont les mêmes.Ma suggestion serait de réparer ce produit
myEnumerable
, ou si vous ne pouvez pas faire cela, d'ajouter une case façon plus tôt pour voir si elle est nulle et de réagir de façon appropriée.Comment sur
Je ne pense pas que l'aide de la méthode d'extension est une mauvaise idée.
CountOrZero
. Personnellement, je pense que c'est plus clair.- Je utiliser une méthode d'extension personnalisée:
Je voudrais aussi écrire ma propre méthode d'extension
CountOrZeroForNull
, comme dans d'autres réponses.D'ailleurs... au Lieu de:
vous pourriez écrire:
Ce n'est pas de soulager votre problème spécifique, mais il contourne l'allocation d'une partie inutilisée de tableau. (
Enumerable.Empty<T>
est probablement mis en œuvre comme une simpleyield break
déclaration.)Enumerable.Empty<T>
retourne en fait un singleton videT[]
tableau.Tout simplement créer votre propre méthode d'extension qui gère null enumerables comme vous le souhaitez.
Vous pouvez simplement utiliser:
C'est la grande chose au sujet des méthodes d'extension. Ils fonctionnent toujours bien, même si l'objet sur lequel (vous semblez être) en appelant la méthode est
null
.// 4
commentaire); peut-être vérifier que c'est bien ce que vous souhaitiez.En 2019, le tidiest façon de le faire est
var count = myEnumerable?.Count() ?? 0;
.Quelles sont les actions que vous prenez si la valeur retournée est 0?
Si c'est ce qui est intéressant, peut-être que vous devriez utiliser Haack est
IsNullOrEmpty
méthode d'extension pourIEnumerable
comme suit:Le lien est http://haacked.com/archive/2010/06/10/checking-for-empty-enumerations.aspx
Posté un commentaire sur le blog, vous trouverez également un
Exception
classe, j'ai écrit pour aller avec ça:Alors que ce n'est pas aussi technique que les autres réponses, il est de loin le plus lisible.