105 votes

Tester si toutes les valeurs d'une liste sont uniques

J'ai une petite liste d'octets et je veux tester qu'ils ont tous des valeurs différentes. Par exemple, j'ai ceci :

List<byte> theList = new List<byte> { 1,4,3,6,1 };

Quelle est la meilleure façon de vérifier si toutes les valeurs sont distinctes ou non ?

196voto

juergen d Points 85039
bool isUnique = theList.Distinct().Count() == theList.Count();

86voto

Tim Schmelter Points 163781

Voici une autre approche qui est plus efficace que Enumerable.Distinct + Enumerable.Count (d'autant plus si la séquence n'est pas un type de collection). Il utilise un HashSet<T> qui élimine les doublons, est très efficace dans les recherches et possède une propriété de comptage :

var distinctBytes = new HashSet<byte>(theList);
bool allDifferent = distinctBytes.Count == theList.Count;

ou une autre approche, plus subtile et plus efficace :

var diffChecker = new HashSet<byte>();
bool allDifferent = theList.All(diffChecker.Add);

HashSet<T>.Add renvoie à false si l'élément n'a pas pu être ajouté puisqu'il se trouvait déjà dans le fichier HashSet . Enumerable.All s'arrête au premier "faux".

10voto

Jodrell Points 14205

Voici la méthode la plus efficace à laquelle j'ai pensé en utilisant le standard .Net.

using System;
using System.Collections.Generic;

public static class Extension
{
    public static bool HasDuplicate<T>(
        this IEnumerable<T> source,
        out T firstDuplicate)
    {
        if (source == null)
        {
            throw new ArgumentNullException(nameof(source));
        }

        var checkBuffer = new HashSet<T>();
        foreach (var t in source)
        {
            if (checkBuffer.Add(t))
            {
                continue;
            }

            firstDuplicate = t;
            return true;
        }

        firstDuplicate = default(T);
        return false;
    }
}

En fait, quel est l'intérêt d'énumérer deux fois la séquence entière si tout ce que vous voulez faire est de trouver le premier doublon.

Je pourrais optimiser encore plus ce processus en mettant sous boîtier spécial les séquences vides et les séquences à un seul élément, mais cela réduirait la lisibilité et la facilité de maintenance pour un gain minimal.

8voto

La logique similaire à Distinct en utilisant GroupBy :

var isUnique = theList.GroupBy(i => i).Count() == theList.Count;

1voto

Gauravsa Points 4972

On peut aussi le faire : Utiliser Hashset

var uniqueIds = new HashSet<long>(originalList.Select(item => item.Id));

            if (uniqueIds.Count != originalList.Count)
            {
            }

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