C# 收集两点不返回任何结果

标签 c# linq iequalitycomparer

类:

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。

您必须覆盖类中默认的 EqualGetHashCode 方法,或者告诉交集使用您的比较器实现。但是您不应该在数据存储类中实现比较器。

关于C# 收集两点不返回任何结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39875425/

相关文章:

c# - XNA:Unload() 的意义何在?

linq - 如何在 Linq lambda 表达式中使用 'select new'?

C# Linq 将元素添加到满足条件的对象列表中

c# - 使用 IEqualityComparer 查找记录

.net - LINQ to Entities 无法识别“Boolean Contains”方法

c# - Enumerable.Except 的两个重载之间的区别?

c# - 通过 TcpClient [C#] 的 HTTP(S) POST/GET 请求

c# - 如何使用 C# 发送/接收 SOAP 请求和响应?

c# - 将表名传递给 dbContext 并从 Entity Framework 中的表中获取值

c# - 使用 linq 遍历大型数据库表