Выбор DataRows в новые структуры с помощью LINQ. Вызов Distinct () не удался - PullRequest
1 голос
/ 11 января 2010

Рассмотрим эти две структуры:

struct Task
{
    public Int32 Id;
    public String Name;
    public List<Registration> Registrations;
}

struct Registration
{
    public Int32 Id;
    public Int32 TaskId;
    public String Comment;
    public Double Hours;
}

Я выбираю группу записей в DataTable в новые структуры, например:

var tasks = data.AsEnumerable().Select(t => new Task
{
    Id = Convert.ToInt32(t["ProjectTaskId"]),
    Name = Convert.ToString(t["ProjectTaskName"]),
    Registrations = new List<Registration>()
});

Но когда я вызываю Distinct() для коллекции, она не распознает объекты с такими же значениями ( Id , Имя , Регистрация ) как быть равным.

Но если я использую компаратор равенства; сравнивая свойство Id на объектах, все нормально и круто ...:

class TaskIdComparer : IEqualityComparer<Task>
{
    public bool Equals(Task x, Task y)
    {
        return x.Id == y.Id;
    }


    public Int32 GetHashCode(Task t)
    {
        return t.Id.GetHashCode();
    }
}

Что мне здесь не хватает? Distinct() проверяет что-то еще, кроме значения свойств?

Ответы [ 2 ]

3 голосов
/ 11 января 2010
Метод

LINQ Distinct сравнивает объекты, используя реализации Equals и GetHashCode объектов.
Поэтому, если эти методы не переопределены, они будут сравниваться по ссылке, а не по значению.

Вам нужно использовать EqualityComparer. (Или реализовать Equals и GetHashCode для класса Task)

0 голосов
/ 11 января 2010

я предполагаю, что это список там. Почти наверняка два объекта списка различны, даже если они содержат одинаковую информацию.

...