类:
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());
}
}
我试图在两个集合中找到公共(public)点(交点),但结果是空集合——其中应该有两个元素。为什么?我已经实现了 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();
交集是一个空列表,但其中应该有两个元素。
最佳答案
IEqualityComparer
是一个接口(interface),您可以为 Intersect
方法提供比较项目的接口(interface)。默认情况下不使用它来比较任何东西。因此,您的代码只是在 Object
中使用内置的 Equals
,除非对象是同一对象,否则它将返回 false。
您必须覆盖类中默认的 Equal
和 GetHashCode
方法,或者告诉交集使用您的比较器实现。但是您不应该在数据存储类中实现比较器。
关于C# 收集两点不返回任何结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39875425/