2013-04-22 44 views
2

所以,我有我的LINQ代码,在那里我必须选择一个不同的数据集的问题,我实现以下IEqualityComparerLINQ - 区别被忽略?

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对象都有一个角色ID,(INT)

回答

15

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

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

+0

哇!很简单!我怎么错过了?完美的工作,如现在的打算。非常感谢! – 2013-04-22 13:11:19

+0

并感谢在比较中的小课程:) – 2013-04-22 13:34:36

+0

@FelixWeir:欢迎您:) – 2013-04-22 13:37:21

3

尝试:

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