【问题标题】:LINQ - Distinct is ignored?LINQ - Distinct 被忽略?
【发布时间】:2013-04-22 13:07:01
【问题描述】:

所以我的 LINQ 代码有问题,我必须选择一个 Distinct 数据集,我实现了以下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)

【问题讨论】:

    标签: c# .net linq distinct gethashcode


    【解决方案1】:

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

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

    【讨论】:

    • 哇!很简单!我怎么错过了?按照现在的预期工作完美。非常感谢!
    【解决方案2】:

    试试:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多