Como posso verificar se dois valores em c # são iguais? (Dado qualquer tipo de valor)
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
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
}
}