636 votes

Quelle méthode est la plus performante : .Any() ou .Count() > 0 ?

Dans le System.Linq nous pouvons maintenant étendre notre de IEnumerable pour avoir le Tout() y Compter() méthodes d'extension .

On m'a dit récemment que si je veux vérifier qu'une collection contient 1 ou plusieurs éléments, je dois utiliser la fonction .Any() au lieu de la méthode d'extension .Count() > 0 car la méthode d'extension .Count() La méthode d'extension doit itérer à travers tous les éléments.

Deuxièmement, certaines collections ont un propriété (pas une méthode d'extension) qui est Count ou Length . Serait-il préférable de les utiliser, au lieu de .Any() ou .Count() ?

yea / nae ?

0 votes

Il est préférable d'utiliser Any() sur les Enumérables et Count sur les Collections. Si quelqu'un pense qu'écrire '(somecollection.Count > 0)' sera source de confusion ou de problèmes de lisibilité, il vaut mieux l'écrire comme une méthode d'extension et la nommer Any(). Tout le monde sera alors satisfait. Du point de vue des performances et de la lisibilité. Ainsi, tout votre code sera cohérent et chaque développeur de votre projet ne devra pas s'inquiéter de choisir entre Count et Any.

2 votes

Vous avez vu Count() > 0 vs Any(), mais avez-vous vu Distinct().Count() > 1 vs Distinct().Skip(1).Any() ? Cette dernière est définitivement beaucoup plus rapide pour un grand nombre d'éléments où Count doit itérer sur l'ensemble pour obtenir un compte. Skip(1).Any() évite l'énumération complète. 100k itérations de la vérification d'un tableau de 1000 éléments avec des chaînes de 1 caractère qui s'exécute en environ 4000ms pour Count() > 1, s'exécute en seulement 20ms pour Skip(1).Any().

-1voto

RRaveen Points 1

J'ai créé une application d'exemple utilisant IList avec 100 éléments à 1 millions d'éléments pour voir Count vs Any qui est le meilleur.

Code

class Program
{
    static void Main()
    {

        //Creating List of customers
        IList<Customer> customers = new List<Customer>();
        for (int i = 0; i <= 100; i++)
        {
            Customer customer = new Customer
            {
                CustomerId = i,
                CustomerName = string.Format("Customer{0}", i)
            };
            customers.Add(customer);
        }

        //Measuring time with count
        Stopwatch stopWatch = new Stopwatch();
        stopWatch.Start();
        if (customers.Count > 0)
        {
            Console.WriteLine("Customer list is not empty with count");
        }
        stopWatch.Stop();
        Console.WriteLine("Time consumed with count: {0}", stopWatch.Elapsed);

        //Measuring time with any
        stopWatch.Restart();
        if (customers.Any())
        {
            Console.WriteLine("Customer list is not empty with any");
        }
        stopWatch.Stop();
        Console.WriteLine("Time consumed with count: {0}", stopWatch.Elapsed);
        Console.ReadLine();

    }
}

public class Customer
{
    public int CustomerId { get; set; }
    public string CustomerName { get; set; }
}

Résultat : enter image description here

Tout est mieux que le nombre.

0 votes

Vous comparez .Count con .Any() et avec ces quantités minuscules, tout ce que vous mesurez, c'est le temps qu'il faut pour écrire sur la console, qui varie largement à chaque exécution. Sans le Console.WriteLine appels, Count est plus rapide, ce qui n'a vraiment pas besoin d'une preuve supplémentaire.

0 votes

@RRaveen - vérifier github.com/dotnet/BenchmarkDotNet pour savoir comment faire un bon benchmarking du code C#. Cela vous aidera énormément !

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