47 votes

C #: Méthode recommandée pour vérifier si une séquence est vide

Une méthode retourne une séquence de, IEnumerable<T>, et vous voulez maintenant pour vérifier si il est vide. Comment recommandez-vous faire cela? Je suis à la recherche d'une bonne lisibilité et une bonne performance.

La première et la plus évidente consiste à vérifier que le nombre est supérieur à zéro:

if(sequence.Count() == 0)

A décent des raisons de lisibilité, mais terrible de la performance car il a fait passer à travers l'ensemble de la séquence.

Une méthode que j'ai parfois l'utilisation est la suivante:

if(!sequence.Any())

Ce n'est pas (que je sache) de passer par l'ensemble de la séquence, mais la lisibilité est un peu en arrière et mal à l'aise. (Lit beaucoup mieux si nous sommes vérifier que la séquence est pas vide si).

Une autre option est d'utiliser First dans un try-catch, comme ceci:

try
{
    sequence.First();
}
catch(InvalidOperationException)
{
    // Do something
}

Pas une très jolie solution, et probablement aussi plus lente, puisque c'est à l'aide d'exceptions et d'autres choses. Pourrait empêcher que par l'utilisation d' FirstOrDefault de cours, à l'exception de vous aurait un gros problème si le premier élément de la séquence en fait était la valeur par défaut ;)

Ainsi, tous les autres moyens de vérifier si une séquence est vide? Lequel utilisez-vous habituellement? Que l'on ne vous recommandons d'utiliser?

Remarque: Pour une lisibilité optimale j'ai sans doute l'un des ci-dessus des extraits dans un IsEmpty méthode d'extension, mais je suis toujours curieux, puisque j'allais avoir à faire quelque chose à l'intérieur de cette méthode ainsi :p

81voto

Jon Skeet Points 692016

Je voudrais utiliser !sequence.Any() , personnellement.

Si vous en avez vraiment besoin, vous pouvez toujours écrire votre propre méthode d'extension:

 public static bool IsEmpty<T>(this IEnumerable<T> source)
{
    return !source.Any();
}
 

Ensuite, vous pouvez écrire:

 if (sequence.IsEmpty())
 

6voto

Manish Basantani Points 4347

Vous pouvez créer une méthode d'extension avec cette implémentation.

 public static bool IsEmpty<T>(this IEnumerable<T> items) {
            var enumerator = items.GetEnumerator();
            return !enumerator.MoveNext();
        }
 

2voto

Neil Barnwell Points 20731

Bien que toutes ces méthodes vous appelez sont LINQ méthodes d'extension, de sorte qu'il dépend de la façon dont le fournisseur LINQ a été mis en œuvre. Si vous voulez savoir si une séquence est vide, Count() == 0 ou Any() == false est approprié. Je préfère Any() moi-même.

Toutefois, en fonction de ce Type réel de votre sequence est, vous pourriez ne pas avoir besoin d'utiliser une extension LINQ méthode. I. e. si c'est un tableau, vous pouvez appeler sequence.Length. Si c'est une collection, vous pouvez utiliser sequence.Count.

0voto

Nick Points 4676

Vous avez dit:

if(sequence.Count() == 0) A décent des raisons de lisibilité, mais terrible de la performance car il a fait passer à travers l'ensemble de la séquence.

Est-ce réellement vrai? Vous parlez de traiter avec une Interface, IEnumerable<T>, et pourtant, vous avez à faire des hypothèses quant à sa mise en œuvre, qui peut ou peut ne pas être vrai. En fait, la plupart des collections personnalisées que j'ai écrit au cours des années garder privé de la variable qui stocke le nombre en interne, ce qui signifie que le retour .Count est une question sans importance qui ne nécessite pas d'une itération à l'ensemble de la collection.

Donc, avec cela dit, sauf si vous savez qu'une mise en œuvre spécifique est mal optimisé pour .Count, je voudrais utiliser .Count. Éviter l'optimisation prématurée dans la mesure du possible, et s'en tenir à la lisibilité.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X