查找和比较两个对象,同时避免 NullReferenceException

Finding and comparing two objects, while avoiding NullReferenceException

我正在尝试将原始对象与更新后的对象进行比较,以确定它们是否彼此不同。比较逻辑应该如下:

下面的代码解决了这个问题,但是它又长又笨重,所以我问是否可以缩短它并制作'prettier'?

var a = original.SomeList.FirstOrDefault(p => p != null && p.EType == EnumType.FooEnum);
var b = updated.SomeList.FirstOrDefault(p => p != null && p.EType == EnumType.FooEnum);
var bEqual = false;
if (a == null && b == null)
    bEqual = true;
else if (a != null && b != null)
    bEqual = a.Number == b.Number;

在 C# 6.0 中,您可以使用 null 传播运算符:

var a = original.SomeList.FirstOrDefault(p => p != null && p.EType == EnumType.FooEnum);
var b = updated.SomeList.FirstOrDefault(p => p != null && p.EType == EnumType.FooEnum);
return a?.Number == b?.Number;

好吧,你可以立即做到这一点

 var a = original.SomeList.FirstOrDefault(p => p != null && p.EType == EnumType.FooEnum);
 var b = updated.SomeList.FirstOrDefault(p => p != null && p.EType == EnumType.FooEnum);
 var bEqual = false;
 if (a == null && b == null)
     bEqual = true;
 else
     bEqual = a.Number == b.Number;

您已经在检查它们是否为空,因此如果它们为空,则您将 bEqual 设置为 true;如果它们不为空,那么您只需执行下面的正常代码即可。

现在不测试你的代码我认为你可以做这样的事情

 if(original.SomeList.FirstOrDefault(p => p != null && p.EType == EnumType.FooEnum) != null && updated.SomeList.FirstOrDefault(p => p != null && p.EType == EnumType.FooEnum) != null)
    bEqual = original.Number == updated.Number;

如果我在家,按照这些思路应该就足够了,我会为您测试并确保它足够接近。

您可以使用条件运算符减少它:

var a = original.SomeList.FirstOrDefault(p => p != null && p.EType == EnumType.FooEnum);
var b = updated.SomeList.FirstOrDefault(p => p != null && p.EType == EnumType.FooEnum);
bool bEqual = (a == null && b == null)? true : 
                 (a != null && b != null)? a.Number == b.Number : false;
return (a == null) ? (b == null) :
    (b != null && a.Number == b.Number);

更好的解决方案是创建一整套相等函数和运算符。这意味着实施 IEquatable 并覆盖 Object.Equals(object)。总共四个小函数可以让你写:

return a == b;

MSDN 有一篇关于重写相等函数的好文章。

How to: Define Value Equality for a Type (C# Programming Guide)