¿Hay una colección en C # que no le permita agregarle elementos duplicados? Por ejemplo, con la tonta clase 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);
}
}
El siguiente código (obviamente) lanzará una excepción:
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);
Pero, ¿hay una clase que garantice de manera similar la singularidad, pero sin KeyValuePairs? Pensé HashSet<T>
que haría eso, pero después de leer los documentos, parece que la clase es solo una implementación establecida ( figura ).
HashSet<T>
. MSDN dice "La clase HashSet <T> proporciona operaciones de conjuntos de alto rendimiento. Un conjunto es una colección que no contiene elementos duplicados y cuyos elementos no están en ningún orden en particular".HashSet<T>
es insuficiente?Dictionary<K,V>
clase no garantiza ningún tipo de pedido.HashSet<T>.Add
método y lanza cuandofalse
...Respuestas:
HashSet<T>
es lo que estás buscando. De MSDN (énfasis agregado):Tenga en cuenta que el
HashSet<T>.Add(T item)
método devuelve unbool
-true
si el elemento se agregó a la colección;false
si el artículo ya estaba presente.fuente
IEquatable
, puede pasar una implementación (personalizada) de laEqualityComparer<T>
instancia alHashSet<T>
constructor.¿Qué tal un método de extensión en HashSet?
fuente
Desde la
HashSet<T>
página en MSDN:(énfasis mío)
fuente
Si todo lo que necesita es garantizar la unicidad de los elementos, entonces HashSet es lo que necesita.
¿A qué se refiere cuando dice "solo una implementación establecida"? Un conjunto es (por definición) una colección de elementos únicos que no guarda el orden de los elementos.
fuente
Puedes probar
HashSet<T>
fuente
Solo para agregar mis 2 centavos ...
si necesita un lanzamiento de ValueExistingException,
HashSet<T>
también puede crear su colección fácilmente:esto puede ser útil, por ejemplo, si lo necesita en muchos lugares ...
fuente
Puede buscar una especie de lista única de la siguiente manera
y puedes usarlo como sigue
solo volverá
"abc","def","ghi","jkl","mno"
siempre incluso cuando se le agreguen duplicadosfuente