【发布时间】:2016-10-05 13:32:52
【问题描述】:
类:
public class Point : IEqualityComparer<Point>
{
public char HorizontalPosition { get; set; }
public int VerticalPosition { get; set; }
public Point(char horizontalPosition, int verticalPosition)
{
HorizontalPosition = char.ToUpper(horizontalPosition);
VerticalPosition = verticalPosition;
}
public bool Equals(Point x, Point y)
{
return (x.VerticalPosition == y.VerticalPosition && x.HorizontalPosition == y.HorizontalPosition);
}
public int GetHashCode(Point obj)
{
return (obj.HorizontalPosition.GetHashCode() + obj.VerticalPosition.GetHashCode());
}
}
我试图在两个集合中找到公共点(交点),但结果是空集合 - 两个元素应该在其中。为什么?我已经实现了 IEqualityComparer。我是不是做错了什么?
示例集合:
List<Point> first = new List<Point> { new Point('a', 1), new Point('b', 2) };
List<Point> second = new List<Point> { new Point('a', 1), new Point('b', 2) };
List<Point> intersection = first.Intersect(second).ToList();
Intersection 是空列表,但里面应该有两个元素。
【问题讨论】:
-
哇,文档看起来有问题。你的类型应该实现
IEquatable<Point>,而不是IEqualityComparer<Point> -
@Dennis_E 除了它不会像你期望的那样工作。原因如下:stackoverflow.com/questions/1645891/…
-
@decPL 该链接表示如果您不实施
GetHashCode(),它将无法正常工作。但他有,所以我不明白为什么它不能按预期工作。 -
如果您不覆盖
public int GetHashCode(),该链接将无法正常工作。他所做的是他为IComparable<T>.GetHashCode(T)提供了一个实现,它永远不会因为其他人在他们的答案中指定的原因而被调用。如果您不信任我,请自行检查。 -
@decPL 我没有注意到它是
IEqualityComparer<Point>.GetHashCode()而不是object.GetHashCode()。无论如何,这将详细介绍实际实现IEquatable<T>。我只是在说IEqualityComparer<T>而不是IEquatable<T>的文档上发表评论。这句话看起来不对:“默认相等比较器 Default 用于比较实现 IEqualityComparer泛型接口的类型的值。”
标签: c# linq iequalitycomparer