Enumerable.FirstOrDefault方法是否可以处理null参数

时间:2011-05-16 06:20:27

标签: c# linq-to-entities

是否可以编写此代码,以便在与具有null Parent的对象(x)进行比较时返回列表中具有null属性null的项?

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

假设正确覆盖了“Equals”方法,那么在“objList”中有一个带有null Parent的项目时会出现这种情况 - “对象引用未设置为对象的实例”。异常。

我认为这是因为如果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;
    }

因此虽然它确实有效,但它并不是很优雅。

2 个答案:

答案 0 :(得分: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是否为null,使用不同的lambda。如果它为null,则只需查找Parent为空的对象。如果没有,则可以安全地调用x.Parent.Equals并使用lambda来执行此操作。

答案 1 :(得分:3)

您可以改为使用object.Equals

MyObject obj = objList.FirstOrDefault(o => object.Equals(n.Parent, x.Parent));
只要两个参数都不为空,

object.Equals将使用第一个参数Equal覆盖。

相关问题