У меня есть объект типа T
, который реализует IEquatable<T>
(методы Equals
и GetHashCode
реализованы). Я использую эти объекты в HashSet<T>
. Но для моей разработки мне нужно обновить элементы этого хеш-набора до коллекций объектов T
(списки или массивы будут работать, например, я буду использовать HashSet<List<T>>
). Эти коллекции (например, List<T>
) имеют методы по умолчанию Equals
и GetHashCode
, но как я могу переопределить их, чтобы две коллекции считались равными тогда и только тогда, когда они последовательно равны? И как получить соответствующий GetHashCode
? Эта функциональность уже каким-то образом присутствует в .Net? Я мог бы определить новый тип TT
, который, например, обертывает List<T>
, реализует IEquatable<TT>
и использует Enumerable.SequenceEqual
в методе Equals
. А как же GetHashCode
? Спасибо!
HashSet<T>
имеет конструктор , который принимает IEqualityComparer<T> . Вы можете использовать это, чтобы настроить, как HashSet<T>
сравнивает свои элементы.
Что-то вроде:
public class ListEqualityComparer<T> : IEqualityComparer<List<T>>
{
public bool Equals(List<T> x, List<T> y)
{
if (x is null && y is null)
return true;
if (x is null || y is null)
return false;
return x.SequenceEqual(y);
}
public int GetHashCode(List<T> obj)
{
if (obj is null)
return 0;
var hashCode = new HashCode();
foreach (var item in obj)
{
hashCode.Add(item);
}
return hashCode.ToHashCode();
}
}
Затем:
var hashSet = new HashSet<List<YourType>>(new ListEqualityComparer<YourType>());