正确使用 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 时,GetHashCode
在 Equals
方法 之前 被调用,并且仅当 GetHashCode
等于集合中的两个项目。
所以 GetHashCode
也必须被覆盖 :
public int GetHashCode(Car row)
{
return HashCode.Combine(row.Name, row.Color , row.Size);
}
See full response here
当使用 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 时,GetHashCode
在 Equals
方法 之前 被调用,并且仅当 GetHashCode
等于集合中的两个项目。
所以 GetHashCode
也必须被覆盖 :
public int GetHashCode(Car row)
{
return HashCode.Combine(row.Name, row.Color , row.Size);
}
See full response here