2

所以我的 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 标识,我只想要一个ProjectUserRoleMapunique 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)

4

2 回答 2

15

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

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

于 2013-04-22T13:08:46.420 回答
3

尝试:

public int GetHashCode(ProjectUserRoleMap obj)
{
    return obj.RoleID.GetHashCode();
}
于 2013-04-22T13:09:53.043 回答