我正在尝试将原始对象与更新的对象进行比较,以确定它们是否彼此不同。比较逻辑应如下:
下面的代码解决了这个问题,但它很长而且很笨重,所以我问它是否可以缩短并且做得更漂亮'
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;
答案 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)