LINQ - 返回非空对象的属性值

时间:2013-12-16 18:27:39

标签: c# linq

我有一个包含Person对象的对象列表,该对象可能为null。我想要做的是获取第一个Person对象的Name属性的值,该值不为null,如果所有Person对象都为null,则返回一个空字符串。

我最好的尝试如下:

    string userName = MyObjectList.FirstOrDefault(x => x.Person != null).Person.Name ?? string.Empty;

我想我明白为什么这不起作用;如果Person对于列表中的每个对象都为null,那么我们得到默认值,该值为null,当我尝试访问属性Person时将抛出空引用错误。

我可以通过检查任何对象是否为null然后获取第一个来获得我想要的结果,但我宁愿在一个LINQ语句中完成此操作。任何意见都表示赞赏,谢谢。

4 个答案:

答案 0 :(得分:26)

通常的技巧看起来像这样:

string userName = MyObjectList.Where(x => x.Person != null)
                              .Select(x => x.Person.Name)
                              .FirstOrDefault() ?? string.Empty;

或关注Servy's suggestion

string userName = MyObjectList.Where(x => x.Person != null)
                              .Select(x => x.Person.Name)
                              .DefaultIfEmpty(string.Empty)
                              .First();

更新现在使用C#6 null-conditional operators进行此操作相对容易:

string userName = MyObjectList.FirstOrDefault(x => x.Person != null)?.Person.Name ?? string.Empty;

答案 1 :(得分:2)

我会这样做两个陈述:

var personContainer = MyObjectList.FirstOrDefault(x => x.Person != null);
string userName = personContainer == null ? string.Empty : personContainer.Person.Name;

答案 2 :(得分:0)

您正在访问一个空对象并尝试读取其属性。

看看这样的事情:

var obj = MyObjectList.FirstOrDefault(x => x.Person != null);
string userName = string.Empty;
if (null != obj) {
    userName = obj.Person.Name;
}
祝你好运!

答案 3 :(得分:-1)

您可以先检查您是否有空人:

string userName = (MyObjectList.Any((x => x.Person != null))) ? MyObjectList.FirstOrDefault(x => x.Person != null).Person.Name : stringEmpty;