【问题标题】:How come SortedSet gives unique output without using IEqualitycomparerSortedSet 如何在不使用 IEqualitycomparer 的情况下提供独特的输出
【发布时间】:2016-06-23 04:02:24
【问题描述】:

在高层次上获取引用类型的唯一值需要使用 HashSet 实现 IEqualityComparer,但使用 HashSet 的 SortedSet 似乎不需要它。 这是一个例子。假设我们在下面有 Employee 类和 EmployeeComparer 类 -

public class Employee 
{
    public string Name { get; set; }
    public int Age { get; set; }
}

public class EmployeeComparer : IEqualityComparer<Employee>, IComparer<Employee>
{

    public bool Equals(Employee x, Employee y)
    {
        return string.Equals(x.Name, y.Name);
    }
    public int GetHashCode(Employee obj)
    {
        return obj.Name.GetHashCode();
    }

    public int Compare(Employee x, Employee y)
    {
        return string.Compare(x.Name, y.Name);
    }
}

如果我必须使用 HashSet 根据名称获取唯一的员工,它只有在我有实现 IEqualityComparer 的 EmployeeComparer 时才有效,但如果我使用 SortedSet,即使类 EmployeeComparer 没有实现 IEqualityComparer 而只是 IComparer,它也会给我唯一的值。此处要求提供 GetHashCode() 和 Equals() 方法的唯一性会发生什么?

【问题讨论】:

    标签: c# interface


    【解决方案1】:

    IComparer&lt;T&gt; 足以确定两个对象在语义上是否相等。

    如果ICompararer&lt;T&gt;.Compare() 返回0,则认为对象相等。如果它返回一个非零值,那么它们被认为是不相等的。由于SortedSet&lt;T&gt; 应该按排序顺序排列值,因此它需要一个比较函数,但在此之上不需要相等函数。

    【讨论】:

    • 好的。你是说string.Compare内部满足HashCode比较的要求,这是比较对象的要求?
    • @LearnAndShare 不,哈希码不是比较对象的要求。 .Compare() 足以比较对象。
    • 这个答案是错误的。 IComparer 用于排序,这是与相等不同的概念。我可以有一个包含两个不相等但顺序相同的项目的集合。
    猜你喜欢
    • 1970-01-01
    • 2020-11-06
    • 2021-06-09
    • 2022-08-23
    • 1970-01-01
    • 2021-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多