Сравнение DataRow не работает должным образом

StackOverflow https://stackoverflow.com/questions/614713

  •  03-07-2019
  •  | 
  •  

Вопрос

Я пытаюсь сравнить два 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
}

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top