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

时间:2015-08-10 12:50:47

标签: c# linq null boolean-expression

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

  • 如果对象a和b都不包含SomeList中的对象,其中EType等于EnumType.FooType,则应将它们评估为等于。
  • 如果只有xor b包含SomeList中的对象,其中EType等于EnumType.FooType,则应将它们评估为不同。
  • 如果两个对象都包含如上所述的对象,并且两个对象上的属性Number相等,那么对象a和b应该被评估为等于。

下面的代码解决了这个问题,但它很长而且很笨重,所以我问它是否可以缩短并且做得更漂亮'

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;

4 个答案:

答案 0 :(得分:1)

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

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;

答案 1 :(得分:1)

直接击球你可以做到这一点

 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;

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

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

 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;

如果我在家,那么沿着这些方向的东西应该足够我会为你测试它并确保它应该足够接近。

答案 2 :(得分:1)

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

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;

答案 3 :(得分:1)

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)