默认情况下,使用数学集相等性设置类
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
有更好的方法吗?
在某个库中是否已经有类似的类?