c# - mvc - ¿Colección que solo permite elementos únicos en.NET?
hashset vs list (6)
¿Hay alguna colección en C # que no le permita agregarle elementos duplicados? Por ejemplo, con la clase tonta 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 arrojará (obviamente) 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 alguna clase que garantice de forma similar la singularidad, pero sin KeyValuePairs? Pensé que HashSet<T>
haría eso, pero después de leer los documentos parece que la clase es solo una implementación establecida ( imagínate ).
¿Qué tal solo un método de extensión en HashSet?
public static void AddOrThrow<T>(this HashSet<T> hash, T item)
{
if (!hash.Add(item))
throw new ValueExistingException();
}
Desde la página MSDN en MSDN:
La clase HashSet (Of T) proporciona operaciones de conjunto de alto rendimiento. Un conjunto es una colección que no contiene elementos duplicados y cuyos elementos no están en ningún orden particular.
(énfasis mío)
Puede probar MSDN
Si todo lo que necesita es garantizar la exclusividad de los elementos, entonces HashSet es lo que necesita.
¿A qué te refieres cuando dices "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.
Solo para agregar mis 2 centavos ...
si necesita un HashSet HashSet<T>
ValueExistingException-throwing HashSet<T>
también puede crear su colección fácilmente:
public class ThrowingHashSet<T> : ICollection<T>
{
private HashSet<T> innerHash = new HashSet<T>();
public void Add(T item)
{
if (!innerHash.Add(item))
throw new ValueExistingException();
}
public void Clear()
{
innerHash.Clear();
}
public bool Contains(T item)
{
return innerHash.Contains(item);
}
public void CopyTo(T[] array, int arrayIndex)
{
innerHash.CopyTo(array, arrayIndex);
}
public int Count
{
get { return innerHash.Count; }
}
public bool IsReadOnly
{
get { return false; }
}
public bool Remove(T item)
{
return innerHash.Remove(item);
}
public IEnumerator<T> GetEnumerator()
{
return innerHash.GetEnumerator();
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
}
esto puede ser útil, por ejemplo, si lo necesita en muchos lugares ...
HashSet<T>
es lo que estás buscando. Desde MSDN (énfasis agregado):
La
HashSet<T>
proporciona operaciones de conjunto de alto rendimiento. Un conjunto es una colección que no contiene elementos duplicados y cuyos elementos no están en ningún orden particular.
Tenga en cuenta que el HashSet<T>.Add(T item)
devuelve un bool
- true
si el elemento se agregó a la colección; false
si el artículo ya estaba presente.