LINQ - 区别被忽略了吗?

时间:2013-04-22 13:07:01

标签: c# .net linq distinct gethashcode

所以我的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标识,我只需要每个唯一ProjectUserRoleMap一个RoleID,但我的将忽略在RoleID上执行明确选择的严格指令。我完全不知道为什么会这样,并且不了解LINQ足以想到一个解决方法。这是调用代码:

ProjectRoleComparer prCom = new ProjectRoleComparer();

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

此代码为我提供了6个条目,当我知道的条目数量为4时。我使用LINQ时出错了吗?

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

2 个答案:

答案 0 :(得分:15)

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

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

答案 1 :(得分:3)

尝试:

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