Como posso verificar se dois valores em c # são iguais? (Dado qualquer tipo de valor)

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

  •  06-07-2019
  •  | 
  •  

Pergunta

Eu tenho esse código aqui, que se destina a permitir que qualquer tipo de argumentos:

public static void AreEqual(object expectedValue, object actualValue) {
    if (expectedValue == actualValue) {
        HttpContext.Current.Response.Write("Equal");
    } else {
        HttpContext.Current.Response.Write("Not Equal");
    }
}

Se eu chamá-lo usando um par de inteiros que não se comporta muito bem.

AreEqual(3, 3)   // prints Not Equal
Foi útil?

Solução

No nível mais simples:

public static void AreEqual(object expectedValue, object actualValue) {
    if (object.Equals(expectedValue,actualValue)) {
            HttpContext.Current.Response.Write("Equal");
    } else {
            HttpContext.Current.Response.Write("Not Equal");
    }
}

ou com os genéricos (suportes IEquatable<T>):

public static void AreEqual<T>(T expectedValue, T actualValue) {
    if (EqualityComparer<T>.Default.Equals(expectedValue,actualValue)) {
            HttpContext.Current.Response.Write("Equal");
    } else {
            HttpContext.Current.Response.Write("Not Equal");
    }
}

Outras dicas

Apenas para destacar o motivo do comportamento "estranho" é porque quando você lançar um int para objeto boxe ocorre. Os dois 3s são convertidos em objetos e, em seguida, você não está comparando os números mais, você está comparando as referências, o que não será o mesmo.

Para verificar se os dois valores de objetos são iguais uso este:

if (Object.Equals(expectedValue, actualValue)) {

À medida que o operador normais == assume uma object é um tipo de referência (apesar do facto de que os tipos de valor também descem de objectos).

Tente:

if (expectedValue.Equals(actualValue))

e, claro, você precisa null punho, então você deve tentar fazer isso:

Boolean eq = false;
if (expectedValue == null || actualValue == null)
    eq = (expectedValue == actualValue);
else
    eq = expectedValue.Equals(actualValue);

if (eq) {
    HttpContext.Current.Response.Write("Equal");
} else {
    HttpContext.Current.Response.Write("Not Equal");
}

Este é, naturalmente, o mesmo que resposta @ Mike de Nelson:

if (Object.Equals(expectedValue, actualValue))

então vá upvote sua resposta.

if (expectedValue != null)
{
    if (expectedValue.Equals(actualValue))
    {
        // enter code here
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top