【发布时间】:2015-01-17 21:47:38
【问题描述】:
我有一个 Venue 类和一个像这样的 Coordinate 类:
class Venue
{
string Name;
Coordinate coordinate;
}
class Coordinate
{
double latitute;
double longitude;
}
现在,我希望能够根据如下坐标选择场地:
List<Venue> venues = GetAllVenues();
var myVenue = venues.FirstOrDefault(venue=>venue.coordinate == myCoordinate);
我有一个 IEqualityComparer 实现,但 lambda 表达式没有将 IEqualityComparer 作为参数的重载。
如何在 lambda 表达式中使用我的相等比较器?
编辑:
我的相等比较器如下所示:
class CoordinatesEqualityComparer:IEqualityComparer<Coordinate>
{
public bool Equals(Coordinate x, Coordinate y)
{
return x.RowIndex == y.RowIndex && x.ColumnIndex == y.ColumnIndex;
}
public int GetHashCode(Coordinate obj)
{
return obj.GetHashCode();
}
}
当我像这样执行 Union() 操作时,即使两个列表中的坐标相同,它也无法正常工作。
List<Coordinates> coordinates;
CoordinatesEqualityComparer comparer;
coordinates.Union(someOtherListOfCoordinates, comparer);
但是,当我与自身进行联合时,它会起作用。我究竟做错了什么?它与 GetHashCode() 实现有关吗?
编辑 2: 修复 GetHashCode() 方法似乎可以解决问题。
public int GetHashCode(Coordinates obj)
{
// Warning:Hack. Use two prime numbers to generate a hash based on two properties.
return obj.RowIndex.GetHashCode() * 7 + obj.ColumnIndex.GetHashCode() * 13 ;
}
【问题讨论】: