149 votes

Collection qui n'autorise que des éléments uniques dans .NET?

Existe-t-il une collection en C # qui ne vous permette pas d'ajouter des éléments en double? Par exemple, avec la classe idiote de

 public class Customer {
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Address { get; set; }

    public override int GetHashCode() {
        return (FirstName + LastName + Address).GetHashCode();
    }

    public override bool Equals(object obj) {
        Customer C = obj as Customer;
        return C != null && String.Equals(this.FirstName, C.FirstName) && String.Equals(this.LastName, C.LastName) && String.Equals(this.Address, C.Address);
    }
}
 

Le code suivant lève (évidemment) une exception:

 Customer Adam = new Customer { Address = "A", FirstName = "Adam", LastName = "" };
Customer AdamDup = new Customer { Address = "A", FirstName = "Adam", LastName = "" };

Dictionary<Customer, bool> CustomerHash = new Dictionary<Customer, bool>();
CustomerHash.Add(Adam, true);
CustomerHash.Add(AdamDup, true);
 

Mais y a-t-il une classe qui garantira de la même manière l'unicité, mais sans KeyValuePairs? Je pensais que HashSet<T> ferait cela, mais après avoir lu la documentation, il semble que la classe ne soit qu'une implémentation définie (voir figure ).

270voto

Donut Points 32892

HashSet<T> est ce que vous cherchez. À partir de MSDN (italiques ajoutés):

L' HashSet<T> classe fournit une haute performance de l'ensemble des opérations. Un ensemble est une collection qui ne contient pas les éléments en double, et dont les éléments sont dans aucun ordre particulier.

Notez que l' HashSet<T>.Add(T item) méthode retourne un bool -- true si l'élément a été ajouté à la collection; false si l'élément est déjà présent.

19voto

Jonathon Reinhart Points 40535

Que diriez-vous d'une méthode d'extension sur HashSet?

 public static void AddOrThrow<T>(this HashSet<T> hash, T item)
{
    if (!hash.Add(item))
        throw new ValueExistingException();
}
 

15voto

Oded Points 271275

De la page HashSet<T> sur MSDN:

La classe HashSet (Of T) fournit des opérations d'ensemble performantes. Un ensemble est une collection qui ne contient aucun élément en double et dont les éléments ne sont dans aucun ordre particulier.

(c'est moi qui souligne)

5voto

Lloyd Points 1138

Si tout ce dont vous avez besoin est de garantir l'unicité des éléments, alors HashSet est ce qu'il vous faut.

Que voulez-vous dire quand vous dites "juste une implémentation définie"? Un ensemble est (par définition) une collection d'éléments uniques qui n'enregistre pas l'ordre des éléments.

3voto

Danny Chen Points 14781

Vous pouvez essayer HashSet<T>

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