Как я могу проверить, равны ли два значения в C #? (Учитывая любой тип значения) - PullRequest
4 голосов
/ 06 мая 2009

У меня есть этот код, который предназначен для аргументов любого типа:

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

Если я назову его с помощью пары целых чисел, он не очень хорошо себя ведет.

AreEqual(3, 3)   // prints Not Equal

Ответы [ 5 ]

16 голосов
/ 06 мая 2009

На простейшем уровне:

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");
    }
}

Или с генериками (поддерживает 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");
    }
}
4 голосов
/ 06 мая 2009

Просто чтобы подчеркнуть причину "странного" поведения, это потому, что когда вы приводите int к объекту, происходит бокс . Две тройки преобразуются в объекты, и вы больше не сравниваете числа, вы сравниваете ссылки, которые не будут одинаковыми.

3 голосов
/ 06 мая 2009

Чтобы проверить, равны ли два значения объекта, используйте это:

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

Поскольку обычный оператор == предполагает, что object является ссылочным типом (несмотря на тот факт, что типы значений также происходят от объектов).

2 голосов
/ 06 мая 2009

Попробуйте:

if (expectedValue.Equals(actualValue))

и, конечно, вам нужно обработать null, поэтому вы должны попробовать это:

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");
}

Это, конечно же, ответ @ mike nelson :

if (Object.Equals(expectedValue, actualValue))

так что иди и проголосуй за его ответ.

0 голосов
/ 06 мая 2009
if (expectedValue != null)
{
    if (expectedValue.Equals(actualValue))
    {
        // enter code here
    }
}
...