Сравнение DataRow не работает должным образом - PullRequest
3 голосов
/ 05 марта 2009

Я пытаюсь сравнить два DataRow в цикле. Однако следующий оператор if не возвращает true:

if (dt1.Rows[0]["Name"] == dt2.Rows[b]["Name"]) {
    // This never executes
}

Однако, если я добавлю .ToString() в конец каждого DataRow, оператор if вернет true:

if (dt1.Rows[0]["Name"].ToString() == dt2.Rows[b]["Name"].ToString()) {
    // This now executes
}

Столбец «Имя» из той же таблицы / столбца. Так что вопрос довольно простой ... Что я делаю не так?

Спасибо
Стивен

Ответы [ 3 ]

9 голосов
/ 05 марта 2009

Эти ячейки содержат объекты, поэтому вы выполняете сравнение объектов, которое просто выполняет сравнение ссылок, которое отличается от сравнения значений. Он задает вопрос «Являются ли эти два объекта действительно одним и тем же объектом?», По сути, они ссылаются на один и тот же объект, отсюда и «сравнительное сравнение». Когда вы делаете вызов ToString (), вы затем выполняете сравнение строк. Вот почему это работает.

Вот ссылка на обсуждение MS оператора == и сравнение.

7 голосов
/ 05 марта 2009

Поскольку itsmatt сказал , ваш первый фрагмент выполняет сравнительное сравнение. Альтернативой для вызова ToString является использование Object.Equals:

if (Object.Equals(dt1.Rows[0]["Name"], dt2.Rows[b]["Name"])) {
    // stuff
}

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

4 голосов
/ 05 марта 2009

Оператор ==, если он не перегружен, идентичен ReferenceEquals(), то есть он определяет, являются ли два заданных object с одинаковыми экземплярами.

Вызов ToString() возвращает объект класса string, который перегружен оператором ==, который выполняет сравнение строк.

...