LINQ - Distinct is ignored?

本文关键字:ignored is Distinct LINQ | 更新日期: 2023-09-27 18:10:23

所以我有一个问题与我的LINQ代码,我必须选择一个不同的数据集,我实现以下IEqualityComparer:

public class ProjectRoleComparer : IEqualityComparer<ProjectUserRoleMap>
{
    public bool Equals(ProjectUserRoleMap x, ProjectUserRoleMap y)
    {
        return x.RoleID.Equals(y.RoleID);
    }
    public int GetHashCode(ProjectUserRoleMap obj)
    {
        return obj.GetHashCode();
    }
}

在这种情况下,我希望检索一堆与给定项目相关的ProjectUserRoleMap对象,由它的ID标识,我只希望每个唯一的RoleID有一个ProjectUserRoleMap,但是我对RoleID执行不同选择的严格指令被忽略了。我完全不知道为什么会出现这种情况,也不太了解LINQ,无法想出解决办法。下面是呼叫代码:

ProjectRoleComparer prCom = new ProjectRoleComparer();
IEnumerable<ProjectUserRoleMap> roleList = ProjectData.AllProjectUserRoleMap.Where(x => x.ProjectID == id).Distinct(prCom);

这段代码给了我6个条目,当我知道我想要的条目数只有4个。我在使用LINQ时做错了什么吗?

作为参考,ProjectUserRoleMap对象具有RoleID (int)

LINQ - Distinct is ignored?

您对GetHashCode的实现是错误的。返回obj.RoleID.GetHashCode();

背景:
使用IEqualityComparer<T>的代码通常首先比较两个对象的哈希码。只有当这些哈希码相同时,才会调用Equals
它是这样实现的,因为两个不相等的对象可以有相同的哈希键,但是两个相等的对象永远不能有不同的哈希键——如果GetHashCode()正确实现的话。这些知识用于提高比较的效率和性能,因为GetHashCode的实现应该是快速、廉价的操作。

尝试:

public int GetHashCode(ProjectUserRoleMap obj)
{
    return obj.RoleID.GetHashCode();
}