DataRow comparação não funciona como esperado
Pergunta
Eu estou tentando comparar dois DataRow
s em um loop. No entanto, a seguinte declaração if
não retornar true
:
if (dt1.Rows[0]["Name"] == dt2.Rows[b]["Name"]) {
// This never executes
}
No entanto, se eu adicionar .ToString()
ao final de cada DataRow
, a declaração if
retornos true
:
if (dt1.Rows[0]["Name"].ToString() == dt2.Rows[b]["Name"].ToString()) {
// This now executes
}
A coluna "Nome" é da mesma tabela / coluna. Portanto, a questão é muito simples ... O que estou fazendo de errado?
Graças
Stephen
Solução
Como itsmatt disse , o seu primeiro trecho é fazendo uma comparação de referência. Uma alternativa para chamar ToString
é usar Object.Equals
:
if (Object.Equals(dt1.Rows[0]["Name"], dt2.Rows[b]["Name"])) {
// stuff
}
A razão para usar o método estático em vez do método de instância é para evitar problemas com referências nulas.
Outras dicas
Essas células segurar objetos para que você está fazendo uma comparação objeto, que só faz uma comparação de referência, que é diferente de uma comparação de valor. Ele faz a pergunta "São estes dois objetos realmente o mesmo objeto?", Essencialmente, eles estão se referindo ao mesmo objeto, portanto, "comparação de referência". Quando você faz a chamada ToString (), então você está fazendo comparação de cadeia. É por isso que ele funciona.
Aqui está um link para a discussão de operador == e comparação de MS.
O operador ==
, se não for sobrecarregado, é idêntico ao ReferenceEquals()
-. Isto é, ele determina se dois object
s dadas são as mesmas instâncias
A chamada para ToString()
retorna um objeto da classe string
, que tem sobrecarregado operador ==
, que faz comparação de string.