C#中是否有一个考虑空值的.Equals函数?

时间:2016-01-16 12:25:29

标签: c#

我有这段代码:

var upd = newObj.Where(n => oldObj.Any(o =>
  (o.SubTopicId == n.SubTopicId) && 
  (o.Number != n.Number ||
   !o.Name.Equals(n.Name) || 
   !o.Notes.Equals(n.Notes))))
.ToList();

我注意到当Notes为null时,.Equals失败。

  

。“,”exceptionMessage“:”对象引用未设置为的实例   对象 “” exceptionType。 “:” System.NullReferenceException “ ”堆栈跟踪“:”   在   WebRole.Controllers.TopicController<> c__DisplayClass8_1.b__1(子话题   o)在C:\ H \ server \ WebRole \ Controllers \ Web API中 -   Data \ TopicController.cs:系统

中的第118行\ r \ n

我有没有办法让.Equals考虑到o.Notes或n.Notes实际上可能为空?理想情况下,我想知道我是否可以使用其他功能,因为我在代码中的很多地方都进行了这种检查。

2 个答案:

答案 0 :(得分:4)

您可以使用静态object.Equals(object objA, object objB)方法。

鉴于所有内容均来自object,您可以省略object并简单地调用Equals,例如:

 oldObj.Any(o => !Equals(o.Name, n.Name) ...

通过返回null处理其中任一参数为false的情况,并返回true,其中两个参数均为null

the docs

  
      
  • 确定两个对象是否表示相同的对象引用。如果是,则该方法返回 true 。此测试等同于调用ReferenceEquals方法。此外,如果 objA objB null ,则该方法返回 true
  •   
  • 确定 objA objB null 。如果是,则返回 false
  •   
  • 如果两个对象不代表相同的对象引用且 null ,则它会调用 objA 等于 objB )并返回结果。这意味着如果 objA 覆盖Object.Equals(Object)方法,则会调用此覆盖。
  •   

答案 1 :(得分:0)

您可以使用静态object.Equals(object objA, object objB)方法(docs)。此方法处理在可能调用objA.Equals(objB)之前任一参数为null的情况。