2011-05-16 56 views
3

是否可以编写此代码,以便与具有空值的对象(x)进行比较时返回列表中具有父属性为null的项目家长?Enumerable.FirstOrDefault方法是否可能处理空参数

MyObject obj = objList.FirstOrDefault(o => n.Parent.Equals(x.Parent)); 

假设“等于”方法被正确地重写时,其中存在在“objList”用空父项失败 - “对象引用不设置为一个对象的一个​​实例,”用例外。

我会假设发生,因为如果n.Parent为null,您不能调用它的Equal方法。

反正我现在使出这种这种方法:

MyObject obj = null; 
foreach (MyObject existingObj in objList) 
{ 
    bool match = false; 

    if (x.Parent == null) 
    { 
     if (existingObj.Parent == null) 
     { 
      match = true; 
     } 
    } 
    else 
    { 
     if (existingObj.Parent != null) 
     { 
      if (x.Parent.Equals(existingObj.Parent)) 
      { 
       match = true; 
      } 
     } 
    } 

    if (match) 
    { 
     obj= existingObj; 
     break; 
    } 

因此,尽管它的工作,这是不是很优雅。

回答

7

这与FirstOrDefault无关,但它是一个常见的问题,可以通过静态的Object.Equals方法来解决。你想:

MyObject obj = objList.FirstOrDefault(o => Object.Equals(o.Parent, x.Parent)); 

顺便说一句,这种方法看起来是这样的:

public static bool Equals(Object objA, Object objB) 
{ 
    // handle situation where both objects are null or both the same reference 
    if (objA == objB) 
     return true; 
    // both are not null, so if any is null they can't be equal 
    if (objA == null || objB == null) 
     return false; 
    // nulls are already handled, so it's now safe to call objA.Equals 
    return objA.Equals(objB); 
} 

即使该方法不存在,你仍然可以写你的分配是这样的:

MyObject obj = objList.FirstOrDefault(x.Parent == null ? 
    o => o.Parent == null : 
    o => x.Parent.Equals(o.Parent)); 

根据x.Parent是否为空使用不同的lambda。如果它为空,它只需要查找Parent为空的对象。如果不是,则拨打x.Parent.Equals并使用lambda表达式总是安全的。

3

您可以改为使用object.Equals

MyObject obj = objList.FirstOrDefault(o => object.Equals(n.Parent, x.Parent)); 

object.Equals将使用第一个参数Equal覆盖,只要这两个参数不为空。

相关问题