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

本文关键字:NullReferenceException 对象 两个 比较 查找 | 更新日期: 2023-09-27 18:07:13

我正试图将原始对象与更新的对象进行比较,以查找它们是否彼此不同。比较逻辑应该如下所示:

  • 如果对象a和b都不包含一个在SomeList中EType等于EnumType的对象。FooType,它们应该被评估为相等。
  • 如果只有a或b在someelist中包含一个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;

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

return (a == null) ? (b == null) :
    (b != null && a.Number == b.Number);

一个更好的解决方案是创建一整套相等函数和运算符。这意味着实现等价和覆盖object . equals (object)。总共四个小函数将使您能够编写:

return a == b;

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

如何定义类型的值相等性(c#编程指南)

在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;

你已经在检查它们是否为空,所以如果它们为空,那么你将你的equal设置为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;