对象集合上的HashSet



我有一个类型为T的对象,它实现了IEquatable<T>(实现了方法EqualsGetHashCode(。我在HashSet<T>中使用这些对象。但在我的开发中,我需要将这个哈希集的元素升级为T对象的集合(列表或数组都可以,例如我将使用HashSet<List<T>>(。这些集合(例如List<T>(具有默认的EqualsGetHashCode方法,但我如何覆盖它们,使两个集合被称为相等,当且仅当它们顺序相等时?如何获得合适的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>());

最新更新