我有一个类型为T
的对象,它实现了IEquatable<T>
(实现了方法Equals
和GetHashCode
(。我在HashSet<T>
中使用这些对象。但在我的开发中,我需要将这个哈希集的元素升级为T
对象的集合(列表或数组都可以,例如我将使用HashSet<List<T>>
(。这些集合(例如List<T>
(具有默认的Equals
和GetHashCode
方法,但我如何覆盖它们,使两个集合被称为相等,当且仅当它们顺序相等时?如何获得合适的GetHashCode
?该功能是否已在.Net中以某种方式存在?我可以定义一个新的类型TT
,它封装了一个List<T>
,并实现了IEquatable<TT>
,并在Equals
方法中使用了Enumerable.SequenceEqual
。但是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>());