对象集合上的 HashSet
HashSet on collections of objects
我有一个 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>
有一个 constructor which takes an 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>());
我有一个 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>
有一个 constructor which takes an 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>());