Как сравнить 2 List <T>, когда T реализует IEquatable? - PullRequest
0 голосов
/ 13 июня 2018

У меня есть класс и реализует IEquatable:

public class MyObject: IEquatable<MyObject>
{
    public string Name { get; set; }

    public bool Equals(MyObject other)
    {
        if (other == null)
            return false;

        return this.Name.Equals(other.Name);
    }

    public override bool Equals(object o)
    {
        if (ReferenceEquals(null, o)) return false;
        if (ReferenceEquals(this, o)) return true;
        if (o.GetType() != GetType()) return false;

        return Equals(o as MyObject);
    }

    public override int GetHashCode()
    {
        unchecked
        {
            int hash = 29;
            hash = hash * 31 + Name != null ? Name.GetHashCode() : 0;
            return hash;
        }
    }
}

Для краткости примера я просто сохранил свойство Name.У класса есть и другие свойства.

Теперь у меня есть 2 списка (A, B) из MyObject, и я хочу получить список элементов, которые находятся в A, но отсутствуют в B.

Как я могу сделать это, используя LINQ (предпочтительно) и убедившись, что используется IEquatable (или равно)?

1 Ответ

0 голосов
/ 13 июня 2018

Вы можете использовать Enumerable.Except, он будет уже использовать IEquatable<MyObject>:

IEnumerable<MyObject> missingInB = A.Except(B);

Обратите внимание, что свойство Name должно быть доступно только для чтения, если оно используется в GetHashCode для идентификации объекта.

Методы LINQ будут использовать ваши переопределенные Equals и GetHashCode, либо путем реализации IEquatable<T>, либо только унаследованным от System.Object.Другой вариант: передать пользовательский IEqualityComparer<T> на Except (или другие методы LINQ), если вы не хотите изменять свой класс.

...