Возможно ли, чтобы метод Enumerable.FirstOrDefault имел дело с нулевыми параметрами - PullRequest
3 голосов
/ 16 мая 2011

Может ли этот код быть написан так, чтобы элементы в списке со родительским свойством, равным нулю, были возвращены при сравнении с объектом (x), у которого также есть нулевой родитель?Равно «метод корректно переопределен, этот сбой происходит, когда в« objList »есть элемент с нулевым 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 ]

7 голосов
/ 16 мая 2011

Это не имеет ничего общего с 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 нулевым. Если он нулевой, он просто должен искать объекты, у которых Parent равно нулю. Если нет, то всегда безопасно звонить x.Parent.Equals и использует лямбду, которая делает это.

3 голосов
/ 16 мая 2011

Вы можете использовать object.Equals вместо.

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

object.Equals будет использовать первые параметры Equal, пока оба параметра не равны нулю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...