LINQ Except () метод не работает - PullRequest
       2

LINQ Except () метод не работает

5 голосов
/ 15 февраля 2012

У меня 2 IList<T> объекта того же типа ItemsDTO.Я хочу исключить один список из другого.Однако, похоже, это не работает для меня, и мне было интересно, почему?

IList<ItemsDTO> related = itemsbl.GetRelatedItems();
IList<ItemsDTO> relating = itemsbl.GetRelatingItems().Except(related).ToList();

Я пытаюсь удалить элементы из related из списка relating.

Ответы [ 4 ]

11 голосов
/ 15 февраля 2012

Поскольку класс является ссылочным типом, ваш ItemsDTO класс должен переопределить Equals и GetHashCode, чтобы это работало.

1 голос
/ 15 февраля 2012

От MSDN :

Создает разность наборов двух последовательностей с помощью средства сравнения по умолчанию для сравнения значений.

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

Когда вы используете LINQ против SQL Server, вы получаете преимуществоLINQ переводит ваш оператор LINQ в запрос SQL, который может выполнять логическое равенство для вас на основе первичных ключей или компараторов значений.С LINQ to Objects вам нужно определить, что логическое равенство означает для ItemsDTO.И это означает переопределение Equals(), а также GetHashCode().

0 голосов
/ 07 августа 2013

Я просто столкнулся с той же проблемой.Очевидно, .NET думает, что элементы в одном списке отличаются от тех же элементов в другом списке (даже если они на самом деле одинаковы).Вот что я сделал, чтобы это исправить:

Пусть ваш класс унаследует IEqualityComparer<T>, например.

public class ItemsDTO: IEqualityComparer<ItemsDTO>
{
  public bool Equals(ItemsDTO x, ItemsDTO y)
  {
    if (x == null || y == null) return false;

    return ReferenceEquals(x, y) || (x.Id == y.Id); // In this example, treat the items as equal if they have the same Id
  }

  public int GetHashCode(ItemsDTO obj)
  {
    return this.Id.GetHashCode();
  }
}
0 голосов
/ 15 февраля 2012

Кроме того, хорошо работает для типов значений. Однако, поскольку вы используете типы Ref, вам нужно переопределить Equals и GethashCode на вашем ItemsDTO, чтобы заставить это работать

...