Коллекция, которая позволяет только уникальные предметы in.NET?
есть ли в C# коллекция, которая не позволит вам добавлять в нее дубликаты элементов? Например, с глупым классом
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);
}
}
следующий код (очевидно) исключение:
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);
но есть ли класс, который будет аналогично гарантировать уникальность, но без KeyValuePairs? Я думал HashSet<T> сделал бы это, но прочитав документы, кажется, что класс-это просто реализация набора (пойди разберись).
6 ответов:
HashSet<T>Это то, что вы ищете. От MSDN (Курсив мой):The
HashSet<T>класс обеспечивает высокопроизводительные операции набора. Набор-это коллекция, которая не содержит повторяющихся элементов, и чьи элементы не находятся в определенном порядке.отметим, что
HashSet<T>.Add(T item)метод возвращает abool--true, если элемент был добавлен в коллекцию;false, если элемент был уже подарок.
Как насчет просто метода расширения на HashSet?
public static void AddOrThrow<T>(this HashSet<T> hash, T item) { if (!hash.Add(item)) throw new ValueExistingException(); }
С
HashSet<T>страница на MSDN:класс HashSet(Of T) обеспечивает высокопроизводительные операции набора. набор-это коллекция, которая не содержит повторяющихся элементов, и чьи элементы не находятся в определенном порядке.
(выделено мной)
вы можете попробовать
HashSet<T>
Если все, что вам нужно, это обеспечить уникальность элементов, то HashSet-это то, что вам нужно.
Что вы имеете в виду, когда говорите "просто набор реализации"? Набор - это (по определению) набор уникальных элементов, который не сохраняет порядок элементов.
просто добавить мои 2 цента...
Если вам нужно ValueExistingException-throwing
HashSet<T>вы также можете легко создать свою коллекцию: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(); } }это может быть полезно, например, если нужно во многих местах...
Comments