如何比较可空类型?

时间:2010-02-26 12:53:46

标签: c# extension-methods nullable

我有几个地方需要比较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)) ...

然后我有类似的可以为空的int,可空的双打等方法。

是否有更简单的方法来查看两个可空类型是否相同?

更新

原来这个方法存在的原因是因为代码已经从VB.Net转换而来,其中Nothing = Nothing返回false(与C#相比,null == null返回true)。 VB.Net代码应该使用.Equals...代替。

8 个答案:

答案 0 :(得分:67)

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;

答案 1 :(得分:32)

答案 2 :(得分:20)

if (x.Equals(y)) 

答案 3 :(得分:6)

您可以在System.Object上使用静态Equals方法:

var equal = object.Equals(objA, objB);

答案 4 :(得分:5)

只需使用==.Equals()

答案 5 :(得分:3)

答案 6 :(得分:1)

(x?? 0).Equals(y)

将处理null和equals。

答案 7 :(得分:0)

我想找到如何比较C#上两个可为null的int的方法,但是我总是在搜索后获得此链接,因此,如果有人需要精确比较两个可为null的int的话,这可能会有所帮助

a.GetValueOrDefault(int.MinValue).CompareTo(b.GetValueOrDefault(long.MinValue));