在C Sharp .NET中,存在Equals方法和SetEquals方法。区别在哪里?

来自Java,我的第一个想法是不需要SetEquals,只需对所有对象使用Equals方法。

最佳答案

SetEqualsEquals的契约(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.EqualsObject.GetHashCode的想法过于宽泛。通常,您需要特定类型的相等性-通常,首先比较对象是否相等是没有意义的。这很容易构成完全不同的话题,但是与此同时,我至少很高兴.NET没有尝试将这种过于宽泛的想法应用于集合。 IMO使用具有明确含义的SetEquals的功能更加有用。

10-04 10:30