Fel*_*eir 2 .net c# 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();
}
}
Run Code Online (Sandbox Code Playgroud)
在这个上下文中,我希望检索一组ProjectUserRoleMap与给定项目相关的对象,由它的ID标识,我只想要一个ProjectUserRoleMap唯一的RoleID,但是我的严格指令对它执行不同的选择RoleID被忽略.我完全不知道为什么会这样,并且不了解LINQ足以想到一个解决方法.这是调用代码:
ProjectRoleComparer prCom = new ProjectRoleComparer();
IEnumerable<ProjectUserRoleMap> roleList = ProjectData.AllProjectUserRoleMap.Where(x => x.ProjectID == id).Distinct(prCom);
Run Code Online (Sandbox Code Playgroud)
这个代码给了我6个条目,当我知道我想要的条目数是4 时.我对LINQ的使用做错了吗?
作为参考,该ProjectUserRoleMap对象具有RoleID,(int)
Dan*_*rth 15
你的实施GetHashCode是错误的.返回obj.RoleID.GetHashCode();
背景:
消耗的代码IEqualityComparer<T>通常首先比较两个对象的哈希码.只有当这些哈希码相同时Equals才会被调用.
它是这样实现的,因为两个不相等的对象可以具有相同的散列键,但是两个相等的对象永远不能具有不同的散列键 - 如果GetHashCode()正确实现的话.
这种知识用于提高比较的效率和性能,因为实现GetHashCode应该是快速,廉价的操作.
| 归档时间: |
|
| 查看次数: |
259 次 |
| 最近记录: |