Есть ли в 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>
что сделаю это, но, прочитав документацию, кажется, что класс - это просто установленная реализация (см. Рисунок ).
HashSet<T>
. MSDN сообщает: «Класс HashSet <T> обеспечивает высокопроизводительные операции над наборами. Набор - это коллекция, которая не содержит повторяющихся элементов и элементы которой не расположены в определенном порядке».HashSet<T>
недостаточно?Dictionary<K,V>
класс не гарантирует никакого порядка.HashSet<T>.Add
методом, и выбросьте, когдаfalse
...Ответы:
HashSet<T>
это то, что вы ищете. Из MSDN (выделено мной):Обратите внимание, что
HashSet<T>.Add(T item)
метод возвращаетbool
-true
если элемент был добавлен в коллекцию;false
если элемент уже присутствовал.источник
IEquatable
вы можете передать конструктору (настраиваемую) реализациюEqualityComparer<T>
экземпляраHashSet<T>
.Как насчет простого метода расширения в HashSet?
источник
Со
HashSet<T>
страницы в MSDN:(курсив мой)
источник
Если все, что вам нужно, - это обеспечить уникальность элементов, то HashSet - это то, что вам нужно.
Что вы имеете в виду, когда говорите «просто набор реализаций»? Набор - это (по определению) набор уникальных элементов, который не сохраняет порядок элементов.
источник
Можешь попробовать
HashSet<T>
источник
Просто чтобы добавить свои 2 цента ...
если вам нужно исключение ValueExistingException,
HashSet<T>
вы также можете легко создать свою коллекцию:это может быть полезно, например, если вам это нужно во многих местах ...
источник
Вы можете изучить что-то вроде уникального списка следующим образом
и вы можете использовать его следующим образом
будет
"abc","def","ghi","jkl","mno"
всегда возвращаться, даже если к нему добавляются дубликатыисточник