Enumerable.SequenceEqual <TSource>и EqualityComparer <T> - PullRequest
3 голосов
/ 19 апреля 2011

С MSDN

Метод SequenceEqual (IEnumerable, IEnumerable) перечисляет две исходные последовательности параллельно и сравнивает соответствующие элементы с помощью средства сравнения по умолчанию для TSource, Default.Средство сравнения равенства по умолчанию, Default, используется для сравнения значений типов, которые реализуют универсальный интерфейс IEqualityComparer.

a) Как я понимаю в приведенной выше цитате, подразумевается, что EqualityComparer<T>.Default используется для сравненияэлементы типов, которые реализуют IEqualityComparer<T>, тогда как на самом деле Default используется для возврата конкретной реализации IEqualityComparer<T>, которая либо вызывает IEquatable<T>.Equals (при условии, что T присваивается IEquatable<T>), либо вызывает Object.Equals

b) Цитата также предполагает, что TSource должен реализовывать IEqualityComparer<T>, что не соответствует действительности:

   static void Main(string[] args)
   {
        Test test1 = new Test();
        Test test2 = new Test();

        Test[] list1 = { test1, test2 };
        Test[] list2 = { test1, test2 };

        bool eq = list1.SequenceEqual(list2); //works
   }     

  public class Test { }

Поэтому я неправильно истолковал то, что цитата пытается передать или являетсяцитата просто неверна?

спасибо

Ответы [ 2 ]

2 голосов
/ 20 апреля 2011

Не TSource должен реализовывать IEqualityComparer

Но EqualityComparer<T>.Default реализует IEqualityComparer

Используется равенство по умолчанию Comparer , по умолчанию, используетсясравнивать значения типов , которые реализуют универсальный интерфейс IEqualityComparer.

Это слишком не замечает, чтобы упоминать.

2 голосов
/ 19 апреля 2011

С MSDN :

Свойство Default проверяет, реализует ли тип T интерфейс System.IEquatable, и, если да, возвращает EqualityComparer, использующий эту реализацию. В противном случае он возвращает EqualityComparer, который использует переопределения Object.Equals и Object.GetHashCode, предоставленные T.

В вашем примере это просто использует равенство ссылок, которое по умолчаниюРеализация равенства для ссылочных объектов.

...