正确使用 IEqualityComparer 的 GetHashCode

Using GetHashCode of IEqualityComparer the right way

当使用 IEqualityComparer 比较集合中的对象时,我不确定以下哪一种方法是最好的。

这是实现:

class CarComparer : IEqualityComparer<Car>
{
    public bool Equals(Car x, Car y)
    {
        throw new NotImplementedException();
    }

    public int GetHashCode(Car car)
    {
        //
    }
}

这是我 GetHashCode 实施的两个选项

    public int GetHashCode(Car row)
    {
        return HashCode.Combine(row.Name, row.Color , row.Size);
    }

或者,

    public int GetHashCode(Car row)
    {
        return row.GetHashCode();
    }

我不喜欢第一个,因为它使代码更难维护,而且在资源方面可能更便宜。但是很多人都是这么用的

我想稍后在 linq 函数中使用我的 CarComparer。像这样:

cars.Distinct(new CarComparer());

我应该使用哪一个?

这是一个基于意见的问题吗?

正确答案:

使用 LINQ 时,GetHashCodeEquals 方法 之前 被调用,并且仅当 GetHashCode 等于集合中的两个项目。

所以 GetHashCode 也必须被覆盖 :

  public int GetHashCode(Car row)
{
    return HashCode.Combine(row.Name, row.Color , row.Size);
}

See full response here