Как преобразовать List <T> в HashSet <T> в С#?
У меня есть список, который имеет дубликаты объектов. Чтобы решить это, мне нужно преобразовать List в HashSet (в С#). Кто-нибудь знает, как?
Ответы
Ответ 1
Убедитесь, что класс объекта переопределяет Equals
и GetHashCode
, а затем вы можете передать конструктор List<T>
в HashSet<T>
.
var hashSet = new HashSet<YourType>(yourList);
Вы можете увидеть: Каков наилучший алгоритм для переопределенного System.Object.GetHashCode?
Ответ 2
Альтернативный способ:
var yourlist = new List<SomeClass>();
// [...]
var uniqueObjs = yourlist.Distinct(); //Gives you a List with unique Objects of the List.
Обратите внимание, что это возможно только в том случае, если SomeClass
каким-то образом переопределяет GetHashCode
и Equals
. Это справедливо и для
var uniqueObjs = new HashSet<SomeType>(yourOriginalList);
В противном случае вы можете реализовать свой собственный IEqualityComnparer
-класс и передать его в отдельный.
Обратите внимание, что при подходе Distinct()
вы также можете искать различные значения свойств объекта в списке:
var uniqueNames = yourlist.Select(obj => obj.Name).Distinct();
и еще...
Ответ 3
Если ваш тип правильно реализует IEquatable<T>
, Equals()
и GetHashCode()
, то вам не нужно самостоятельно выполнять дедупликацию. Вы можете использовать Linq Distinct()
, чтобы сделать это следующим образом:
myList = myList.Distinct().ToList();