Czy istnieje kolekcja w C #, która nie pozwoli Ci dodać do niej zduplikowanych elementów? Na przykład w przypadku głupiej klasy
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);
}
}
Poniższy kod (oczywiście) zgłosi wyjątek:
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);
Ale czy istnieje klasa, która podobnie gwarantuje wyjątkowość, ale bez KeyValuePairs? Pomyślałem, że HashSet<T>
to zrobię, ale po przeczytaniu dokumentacji wydaje się, że klasa to tylko zestaw implementacji ( rysunek ).
HashSet<T>
. MSDN mówi: „Klasa HashSet <T> zapewnia wysokowydajne operacje na zbiorach. Zestaw to kolekcja, która nie zawiera zduplikowanych elementów i której elementy nie są w określonej kolejności”.HashSet<T>
jest to niewystarczające?Dictionary<K,V>
Klasa nie gwarantuje żadnego rodzaju zamówienia.HashSet<T>.Add
metody i wrzuć, gdyfalse
...Odpowiedzi:
HashSet<T>
jest tym, czego szukasz. Z MSDN (podkreślenie dodane):Zwróć uwagę, że
HashSet<T>.Add(T item)
metoda zwracabool
-true
jeśli element został dodany do kolekcji;false
jeśli przedmiot był już obecny.źródło
IEquatable
możesz przekazać (niestandardową) implementacjęEqualityComparer<T>
instancji doHashSet<T>
konstruktora.A może po prostu metoda rozszerzenia w HashSet?
źródło
Ze
HashSet<T>
strony w MSDN:(podkreślenie moje)
źródło
Jeśli wszystko, czego potrzebujesz, to zapewnienie niepowtarzalności elementów, to HashSet jest tym, czego potrzebujesz.
Co masz na myśli, mówiąc „tylko zestaw implementacji”? Zestaw jest (z definicji) zbiorem unikatowych elementów, które nie zapisują kolejności elementów.
źródło
Możesz spróbować
HashSet<T>
źródło
Dodam tylko moje 2 centy ...
jeśli potrzebujesz wyrzucania wyjątków ValueExistingException
HashSet<T>
, możesz również łatwo utworzyć swoją kolekcję:może to być przydatne na przykład, jeśli potrzebujesz go w wielu miejscach ...
źródło
Możesz spojrzeć na coś w rodzaju Listy Unikalnej w następujący sposób
i możesz go używać w następujący sposób
powróci
"abc","def","ghi","jkl","mno"
zawsze, nawet jeśli zostaną do niego dodane duplikatyźródło