web-dev-qa-db-fra.com

Vérifiez si tous les éléments sont identiques dans une liste

J'ai une liste d'articles (Of DateTime). Comment puis-je vérifier si tous les éléments sont identiques avec une requête LINQ? À tout moment, il peut y avoir 1, 2, 20, 50 ou 100 éléments dans la liste.

Merci

55
Saif Khan

Comme ça:

if (list.Distinct().Skip(1).Any())

Ou

if (list.Any(o => o != list[0]))

(ce qui est probablement plus rapide)

90
SLaks

J'ai créé une méthode d'extension simple principalement pour la lisibilité qui fonctionne sur n'importe quel IEnumerable.

if (items.AreAllSame()) ...

Et l'implémentation de la méthode:

    /// <summary>
    ///   Checks whether all items in the enumerable are same (Uses <see cref="object.Equals(object)" /> to check for equality)
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="enumerable">The enumerable.</param>
    /// <returns>
    ///   Returns true if there is 0 or 1 item in the enumerable or if all items in the enumerable are same (equal to
    ///   each other) otherwise false.
    /// </returns>
    public static bool AreAllSame<T>(this IEnumerable<T> enumerable)
    {
        if (enumerable == null) throw new ArgumentNullException(nameof(enumerable));

        using (var enumerator = enumerable.GetEnumerator())
        {
            var toCompare = default(T);
            if (enumerator.MoveNext())
            {
                toCompare = enumerator.Current;
            }

            while (enumerator.MoveNext())
            {
                if (toCompare != null && !toCompare.Equals(enumerator.Current))
                {
                    return false;
                }
            }
        }

        return true;
    }
8
MSkuta

Version VB.NET:

If list.Distinct().Skip(1).Any() Then

Ou

If list.Any(Function(d) d <> list(0)) Then
3
jor

C'est aussi une option:

 if (list.TrueForAll(i => i.Equals(list.FirstOrDefault())))

Il est plus rapide que if (list.Distinct().Skip(1).Any()) et fonctionne de la même manière que if (list.Any(o => o != list[0])), cependant, la différence n'est pas significative, donc je suggère d'utiliser la plus lisible.

2
KungFury

Ma variante:

var numUniques = 1;
var result = list.Distinct().Count() == numUniques;
0
VBorisoff