在C Sharp .NET中,存在Equals
方法和SetEquals
方法。区别在哪里?
来自Java,我的第一个想法是不需要SetEquals
,只需对所有对象使用Equals
方法。
最佳答案
SetEquals
与Equals
的契约(Contract)不同。特别是它不是对称的,因为参数只是IEnumerable<T>
而不是ISet<T>
。这使您可以在只有一个集合的情况下检查集合是否相等。考虑:
List<int> intList = new List<int> { 1, 2, 3 };
HashSet<int> intSet = new HashSet<int>(intList);
现在我们可以使用:
Console.WriteLine(intSet.SetEquals(intList));
...但是如果不对
Equals
和其他所有List<int>
实现实现相同的行为,就无法以相同的方式实现IEnumerable<T>
。即使我们将其限制为其他集合,也存在一个有趣的问题,即平等实际上意味着什么。例如,考虑两个
HashSet<string>
集,它们包含相同的字符串,但具有不同的相等比较器。 (也许一个区分大小写,一个不区分大小写。)是否相等? SetEquals
通过避免过于笼统而避免了这种哲学问题。那
HashSet<int>
和SortedSet<int>
呢?他们会平等吗?它们可以具有相同的值-但其中一个的顺序未定义。总体而言,在我看来,
Object.Equals
和Object.GetHashCode
的想法过于宽泛。通常,您需要特定类型的相等性-通常,首先比较对象是否相等是没有意义的。这很容易构成完全不同的话题,但是与此同时,我至少很高兴.NET没有尝试将这种过于宽泛的想法应用于集合。 IMO使用具有明确含义的SetEquals
的功能更加有用。