2013-04-22 3 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 объектов, связанных с данный проект, идентифицированный по его идентификатору, мне нужен только один ProjectUserRoleMap за уникальный RoleID, но моя строгая инструкция для выполнения отдельного выбора на RoleID игнорируется. Я совершенно не знаю, почему это так, и не понимаю LINQ, чтобы думать об обходном пути. Вот код вызова:

ProjectRoleComparer prCom = new ProjectRoleComparer(); 

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

Этот код дает мне 6 записей, когда количество записей я знаю Я хочу только 4. Я делаю что-то не так с моим использованием LINQ?

Для справки, ProjectUserRoleMap объекта имеет, Идентификатор роли (INT)

ответ

15

Ваша реализация GetHashCode является неправильной. Возвращение obj.RoleID.GetHashCode();

фона:
код, который потребляет IEqualityComparer<T> обычно сначала сравнивает хэш-коды двух объектов. Только если эти хэш-коды одинаковы, то вызывается Equals.
Он реализуется, как это, потому что две неравные объектов могут иметь хэш-ключ же, но два равных объектов не могут иметь разных ключей хэша - если GetHashCode() правильно реализован.
Это знание используется для повышения эффективности и производительности сравнения, поскольку реализация GetHashCode должна быть быстрой и дешевой операцией.

+0

Вау! Так просто! Как я пропустил это? Работает идеально, как и сейчас. Большое спасибо! –

+0

И спасибо за небольшой урок в сравнении :) –

+0

@FelixWeir: Добро пожаловать :) –

3

Try:

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