Как сравнить обнуляемые типы? - PullRequest
54 голосов
/ 26 февраля 2010

У меня есть несколько мест, где мне нужно сравнить 2 (обнуляемые) значения, чтобы увидеть, совпадают ли они.

Я думаю, что в рамках должно быть что-то для поддержки этого, но ничего не могу найти, поэтому вместо этого имейте следующее:

public static bool IsDifferentTo(this bool? x, bool? y)
{
    return (x.HasValue != y.HasValue) ? true : x.HasValue && x.Value != y.Value;
}

Тогда внутри кода у меня есть if (x.IsDifferentTo(y)) ...

У меня тогда есть похожие методы для обнуляемых целых, обнуляемых двойников и т. Д.

Нет ли более простого способа проверить, совпадают ли два типа, допускающих обнуление?

Обновление:

Оказывается, причиной этого метода было то, что код был преобразован из VB.Net, где Nothing = Nothing возвращает false (сравните с C #, где null == null возвращает true). Код VB.Net должен был использовать вместо .Equals....

Ответы [ 6 ]

68 голосов
/ 26 февраля 2010

C # поддерживает «поднятые» операторы, поэтому, если тип (bool? в данном случае) известен при компиляции, вы должны просто использовать:

return x != y;

Если вам нужны дженерики, тогда EqualityComparer<T>.Default ваш друг:

return !EqualityComparer<T>.Default.Equals(x,y);

Обратите внимание, однако, что оба эти подхода используют подход "null == null" (в отличие от ANSI SQL). Если вам нужно «null != null», то вам придется проверить это отдельно:

return x == null || x != y;
32 голосов
/ 26 февраля 2010
20 голосов
/ 26 февраля 2010
if (x.Equals(y)) 
6 голосов
/ 26 февраля 2010

Вы можете использовать статический метод Равен в System.Object:

var equal = object.Equals(objA, objB);
5 голосов
/ 26 февраля 2010

Просто используйте == или .Equals().

3 голосов
/ 26 февраля 2010

Использование Сравнить:

http://msdn.microsoft.com/en-us/library/dxxt7t2a.aspx

...