Вопросы об IEqualityComparer / List .Distinct ()

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

    class InvoiceComparer : IEqualityComparer<Invoice>
    {
        public bool Equals(Invoice x, Invoice y)
        {
            // A
            if (Object.ReferenceEquals(x, y)) return true;

            // B
            if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null)) return false;

            // C
            return x.TxnID == y.TxnID;
        }

        public int GetHashCode(Invoice obj)
        {
            if (Object.ReferenceEquals(obj, null)) return 0;
            return obj.TxnID2.GetHashCode();
        }
    }
  1. Почему Distinct требует компаратора, а не Func ?
  2. Являются ли (A) и (B) чем-то другим, кроме оптимизации, и есть ли сценарии, когда они не будут действовать ожидаемым образом из-за тонкости в сравнении ссылок?
  3. Если бы я хотел, могу ли я заменить (C) на

    return GetHashCode (x) == GetHashCode (y)

5
задан FishBasketGordo 15 December 2011 в 21:26
поделиться