默认情况下,使用数学集相等性设置类

HashSet不使用set equality语义进行默认的相等操作。

 var a = new HashSet { 1, 2, 3 }; var b = new HashSet { 3, 2, 1 }; 

这评估为false

 var c = a == b; 

而在数学意义上,这两组是相等的。 我们当然可以使用SetEquals显式比较使用set equality:

 var d = a.SetEquals(b); // true 

如果我们创建一组这些集合:

 var e = new HashSet<HashSet> { a, b }; 

结果包含两个元素。 我们需要传递一个自定义比较器来获取父集的语义。

这是HashSet的子类,默认情况下实现set语义。

 public sealed class MathSet : HashSet, IEquatable<MathSet> { public override int GetHashCode() => this.Select(elt => elt.GetHashCode()).Sum().GetHashCode(); public bool Equals(MathSet obj) => SetEquals(obj); public override bool Equals(object obj) => Equals(obj as MathSet); public static bool operator ==(MathSet a, MathSet b) => ReferenceEquals(a, null) ? ReferenceEquals(b, null) : a.Equals(b); public static bool operator !=(MathSet a, MathSet b) => !(a == b); } 

(这是基于此处显示的一个。)

用法示例:

 var a = new MathSet { 1, 2, 3 }; var b = new MathSet { 3, 2, 1 }; var c = a.Equals(b); // true var d = new MathSet<MathSet> { a, b }; // contains one element var e = a == b; // true 

有更好的方法吗?

在某个库中是否已经有类似的类?