查找和比较两个对象,同时避免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;
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;