Pergunta

Eu estou tentando comparar dois DataRows 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

Foi útil?

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 objects 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top