How to compare nullable types?

C#Extension MethodsNullable

C# Problem Overview


I have a few places where I need to compare 2 (nullable) values, to see if they're the same.

I think there should be something in the framework to support this, but can't find anything, so instead have the following:

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

Then, within code I have if (x.IsDifferentTo(y)) ...

I then have similar methods for nullable ints, nullable doubles etc.

Is there not an easier way to see if two nullable types are the same?

Update:

Turns out that the reason this method existed was because the code has been converted from VB.Net, where Nothing = Nothing returns false (compare to C# where null == null returns true). The VB.Net code should have used .Equals... instead.

C# Solutions


Solution 1 - C#

C# supports "lifted" operators, so if the type (bool? in this case) is known at compile you should just be able to use:

return x != y;

If you need generics, then EqualityComparer<T>.Default is your friend:

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

Note, however, that both of these approaches use the "null == null" approach (contrast to ANSI SQL). If you need "null != null" then you'll have to test that separately:

return x == null || x != y;

Solution 2 - C#

Solution 3 - C#

if (x.Equals(y)) 

Solution 4 - C#

You can use the static Equals method on System.Object:

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

Solution 5 - C#

Solution 6 - C#

Just use ==, or .Equals().

Solution 7 - C#

I wanted to find how to compare two nullable int on C#, but I always get this link after search, so if someone needs to compare exactly two nullable int, then this can be helpful

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

Solution 8 - C#

(x?? 0).Equals(y)

will handle null as well as equals.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionDavid_001View Question on Stackoverflow
Solution 1 - C#Marc GravellView Answer on Stackoverflow
Solution 2 - C#Anton GogolevView Answer on Stackoverflow
Solution 3 - C#KashifView Answer on Stackoverflow
Solution 4 - C#Mark SeemannView Answer on Stackoverflow
Solution 5 - C#Randy MinderView Answer on Stackoverflow
Solution 6 - C#LuceroView Answer on Stackoverflow
Solution 7 - C#hdd42View Answer on Stackoverflow
Solution 8 - C#Genius_xView Answer on Stackoverflow