Сравнение DataRow не работает должным образом
Вопрос
Я пытаюсь сравнить два 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(), вы выполняете сравнение строк.Вот почему это работает.
А ==
оператор, если он не перегружен, идентичен ReferenceEquals()
-- то есть он определяет, являются ли два заданных object
это одни и те же случаи.
Звонок в ToString()
возвращает объект string
класс, который перегрузил ==
оператор, который выполняет сравнение строк.