2013-04-22 1 views
2

그래서 나는 별개의 데이터 세트를 선택해야 내 LINQ 코드에 문제가, 내가 IEqualityComparer 다음 구현이 맥락에서LINQ - Distinct가 무시됩니까?

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로 식별되는 특정 프로젝트, 고유 한 RoleID 당 하나만 ProjectUserRoleMap을 지정하지만 RoleID에서 고유 선택을 수행하라는 엄격한 지침은 무시됩니다. 나는 이것이 왜 그런지에 대해 완전히 단서가 있으며 해결 방법을 생각하기에 충분할만큼 LINQ를 이해하지 못한다. 내가 원하는 알고 항목의 수는 단지 4 내가 LINQ의 내 사용량이 뭔가 잘못하고 있습니까 때

ProjectRoleComparer prCom = new ProjectRoleComparer(); 

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

이 코드는 나에게 6 개 항목을 제공합니다, 다음은 호출 코드는? 참고로

ProjectUserRoleMap 객체는

답변

15

GetHashCode의 구현이 잘못 인 역할 ID (int)를 가지고있다. 두 객체의 해시 코드를 비교 첫째, 일반적으로 IEqualityComparer<T>을 소비
코드 : obj.RoleID.GetHashCode();

배경을 돌려줍니다. 해당 해시 코드가 동일한 경우에만 Equals이 호출됩니다. GetHashCode()이 올바르게 구현 된 경우 -이 불평등 객체가 같은 해시 키를 가질 수 있지만, 두 동일한 객체가 다른 해시 키를 가질 수 없습니다 않기 때문에
는 그것은 다음과 같이 구현됩니다.
이 지식은 GetHashCode의 구현이 빠르고 저렴한 작업으로 간주되기 때문에 비교의 효율성과 성능을 향상시키는 데 사용됩니다.

+0

우와! 너무 간단! 나는 그것을 어떻게 놓쳤는가? 의도 한대로 완벽하게 작동합니다. 고마워요! –

+0

비교의 작은 수업에 감사드립니다. –

+0

@FelixWeir : 환영합니다 :) –

3

시도 :

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