Почему SequenceEqual для List <T> возвращает false?

Привет у меня есть некоторые проблемы сSequenceEqual когда у меня такая ситуация:

Sentence s1 = new Sentence { Text = "Hi", Order = 1 };
Sentence s2 = new Sentence { Text = "Hello", Order = 2 };
List list1 = new List { s1, s2 };
List list2 = new List { s1, s2 };

и это отлично работает

bool equal = list1.SequenceEqual(list2);

и возвращается;true

но когда у меня есть метод, который возвращаетList например:

public List Getall()
    {
        Sentence s1 = new Sentence { Text = "Hi", Order = 1 };
        Sentence s2 = new Sentence { Text = "Hello", Order = 2 };

        return new List { s1, s2 };
    }

и используйте это так:

List list1 = Getall();
List list2 = Getall();

а потом просто проверь

bool equal = list1.SequenceEqual(list2);

это возвращаетсяложный', Пожалуйста, скажи мне почему? и как заставить это работать?

 bytefire19 февр. 2013 г., 14:02
Поскольку во втором сценарии они являются разными объектами, то есть их методы GetHash () возвращают разные значения. В первом случае это абсолютно одинаковые объекты с двумя разнымиРекомендации.

Ответы на вопрос(3)

Решение Вопроса

Ваша проблема в том, чтоnew Sentence { Text = "Hi", Order = 1 } не равно другомуnew Sentence { Text = "Hi", Order = 1 }, Хотя содержимое одинаково, у вас есть два отдельных объекта, и если вы немы спроектировали ваш класс, иначе они не равны друг другу, если они не являются буквально одинаковыми объектами (как в первом примере).

ВашSentence класс должен переопределитьEquals а такжеGetHashCodeпо крайней мере, в какой момент вашSequenceEquals должен работать снова.

 Sidney21 апр. 2016 г., 23:04
Этот ответ был близок, но Патрик ĆWiek»Ответ, который рекомендовал использовать IEqualityComparer, был решением для меня.
 Tomasz Kowalczyk19 февр. 2013 г., 14:15
очень хорошо, это работает сейчас, спасибо

Вы создаете два новых экземпляра предложения каждый раз, когда вы звонитеGetall(), При сравнении элементов в спискеSequenceEqual будет использовать компаратор равенства по умолчанию, который просто проверяет, ссылаются ли они на объект sme:т, так они разные.

Что вы можете сделать, это переопределитьEqual() а также== операторы в последовательности для проверки равенства других свойств (таких как текст и порядок).

В качестве альтернативы вы можете написатьIEqualityComparer и передать егоSequenceEqual

КакMSDN заявляет здесь:

Определяет, равны ли две последовательности, сравнивая элементыиспользуя компаратор по умолчанию для их типа.

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

Вы всегда можете использоватьперегрузка, которая принимаетIEqualityComparer

 Rawling19 февр. 2013 г., 14:04
Хороший вопрос о возможности использования компаратора, а не определения поведения в самом классе.

Ваш ответ на вопрос