类:
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();交集是空列表,但其中应该包含两个元素。
发布于 2016-10-05 13:47:21
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, new PointComparer()).ToList();
public class Point
{
public char HorizontalPosition { get; set; }
public int VerticalPosition { get; set; }
public Point(char horizontalPosition, int verticalPosition)
{
HorizontalPosition = char.ToUpper(horizontalPosition);
VerticalPosition = verticalPosition;
}
}
public class PointComparer : IEqualityComparer<Point>
{
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());
}
}试试上面的例子
发布于 2016-10-05 13:38:52
IEqualityComparer是您可以提供给Intersect方法比较项的接口。默认情况下,它不用于比较任何事物。因此,您的代码只是使用Object中内置的Object,它将返回false,除非对象是同一个对象。
您必须重写类中的默认Equal和GetHashCode方法,或者告诉交集使用比较器的实现。但是您不应该在数据存储类中实现比较器。
发布于 2016-10-05 13:39:23
您应该从object重写Equals和GetHashCode:
public class Point
{
public char HorizontalPosition { get; set; }
public int VerticalPosition { get; set; }
public Point(char horizontalPosition, int verticalPosition)
{
HorizontalPosition = char.ToUpper(horizontalPosition);
VerticalPosition = verticalPosition;
}
public override int GetHashCode()
{
unchecked
{
return (HorizontalPosition * 397) ^ VerticalPosition;
}
}
protected bool Equals(Point other)
{
return Equals(HorizontalPosition, other.HorizontalPosition) && Equals(VerticalPosition, other.VerticalPosition);
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != this.GetType()) return false;
return Equals((Point)obj);
}
}还可以实现自定义IEqualityComparer并将其传递给intersect。
public class PointComparer : IEqualityComparer<Point>
{
public bool Equals(Point a, Point b)
{
return a.HorizontalPosition == b.HorizontalPosition && a.VerticalPosition == b.VerticalPosition;
}
public int GetHashCode(Point p)
{
unchecked
{
return (p.HorizontalPosition * 397) ^ p.VerticalPosition;
}
}
}
// ...
List<Point> intersection = first.Intersect(second, new PointComparer()).ToList();正如@decPL的注释中所提到的,您还应该重新考虑您的哈希代码实现。
https://stackoverflow.com/questions/39875425
复制相似问题