Existe-t-il une collection en C # qui ne vous permettra 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èvera (é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 existe-t-il une classe qui garantira de la même manière l'unicité, mais sans KeyValuePairs? Je pensais HashSet<T>
faire cela, mais après avoir lu la documentation, il semble que la classe n'est qu'une implémentation d'ensemble ( allez comprendre ).
HashSet<T>
. MSDN indique «La classe HashSet <T> fournit des opérations d'ensemble de haute performance. Un ensemble est une collection qui ne contient aucun élément en double et dont les éléments ne sont pas dans un ordre particulier».HashSet<T>
est insuffisant?Dictionary<K,V>
classe ne garantit aucun type d'ordre.HashSet<T>.Add
méthode et lancez quandfalse
...Réponses:
HashSet<T>
est ce que vous recherchez. De MSDN (italiques ajoutés):Notez que la
HashSet<T>.Add(T item)
méthode renvoie unbool
-true
si l'élément a été ajouté à la collection;false
si l'élément était déjà présent.la source
IEquatable
, vous pouvez transmettre une implémentation (personnalisée) d'EqualityComparer<T>
instance auHashSet<T>
constructeur.Que diriez-vous simplement d'une méthode d'extension sur HashSet?
la source
À partir de la
HashSet<T>
page sur MSDN:(c'est moi qui souligne)
la source
Si tout ce dont vous avez besoin est d'assurer l'unicité des éléments, alors HashSet est ce dont vous avez besoin.
Que voulez-vous dire quand vous dites "juste une implémentation d'ensemble"? Un ensemble est (par définition) une collection d'éléments uniques qui n'enregistre pas l'ordre des éléments.
la source
Tu peux essayer
HashSet<T>
la source
Juste pour ajouter mes 2 cents ...
si vous avez besoin d'un lancement d'exception ValueExistingException,
HashSet<T>
vous pouvez également créer votre collection facilement:cela peut être utile par exemple si vous en avez besoin dans de nombreux endroits ...
la source
Vous pouvez consulter une sorte de liste unique comme suit
et vous pouvez l'utiliser comme suit
ne reviendra
"abc","def","ghi","jkl","mno"
toujours que lorsque des doublons y sont ajoutésla source