查找和比较两个对象,同时避免 NullReferenceException
Finding and comparing two objects, while avoiding NullReferenceException
我正在尝试将原始对象与更新后的对象进行比较,以确定它们是否彼此不同。比较逻辑应该如下:
- 如果对象 a 和 b 都不包含 SomeList 中 EType 等于 EnumType.FooType 的对象,则应将它们评估为相等。
- 如果只有 a xor b 包含 SomeList 中的一个对象,其 EType 等于 EnumType.FooType,它们应该被评估为不同。
- 如果两个对象都包含上述对象,并且属性两个对象的编号相等,则对象a和b应该被评估为相等。
下面的代码解决了这个问题,但是它又长又笨重,所以我问是否可以缩短它并制作'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)
我正在尝试将原始对象与更新后的对象进行比较,以确定它们是否彼此不同。比较逻辑应该如下:
- 如果对象 a 和 b 都不包含 SomeList 中 EType 等于 EnumType.FooType 的对象,则应将它们评估为相等。
- 如果只有 a xor b 包含 SomeList 中的一个对象,其 EType 等于 EnumType.FooType,它们应该被评估为不同。
- 如果两个对象都包含上述对象,并且属性两个对象的编号相等,则对象a和b应该被评估为相等。
下面的代码解决了这个问题,但是它又长又笨重,所以我问是否可以缩短它并制作'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)