Existe uma coleção em C # que não permite adicionar itens duplicados a ela? Por exemplo, com a classe boba 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);
}
}
O código a seguir (obviamente) lançará uma exceção:
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);
Mas existe uma classe que irá garantir a exclusividade da mesma forma, mas sem KeyValuePairs? Eu pensei HashSet<T>
que faria isso, mas depois de ler a documentação, parece que a classe é apenas uma implementação definida (veja a figura ).
HashSet<T>
. MSDN diz "A classe HashSet <T> fornece operações de conjunto de alto desempenho. Um conjunto é uma coleção que não contém elementos duplicados e cujos elementos não estão em uma ordem específica."HashSet<T>
é insuficiente?Dictionary<K,V>
aula não garante nenhum tipo de pedido.HashSet<T>.Add
método e lançar quandofalse
...Respostas:
HashSet<T>
é o que você está procurando. Do MSDN (ênfase adicionada):Observe que o
HashSet<T>.Add(T item)
método retorna umbool
-true
se o item foi adicionado à coleção;false
se o item já estava presente.fonte
IEquatable
, você pode passar uma implementação (personalizada) daEqualityComparer<T>
instância para oHashSet<T>
construtor.Que tal apenas um método de extensão no HashSet?
fonte
Na
HashSet<T>
página do MSDN:(ênfase minha)
fonte
Se tudo o que você precisa é garantir a exclusividade dos elementos, o HashSet é o que você precisa.
O que você quer dizer quando diz "apenas uma implementação definida"? Um conjunto é (por definição) uma coleção de elementos exclusivos que não salva a ordem dos elementos.
fonte
Podes tentar
HashSet<T>
fonte
Só para adicionar meus 2 centavos ...
se você precisa de um ValueExistingException-throwing,
HashSet<T>
também pode criar sua coleção facilmente:isso pode ser útil, por exemplo, se você precisar em muitos lugares ...
fonte
Você pode olhar para algo como uma Lista Única da seguinte maneira
e você pode usá-lo como segue
só retornará
"abc","def","ghi","jkl","mno"
sempre, mesmo quando duplicatas forem adicionadas a elefonte