如果对象为null,如何返回空字符串?

mar*_*zzz 24 .net c# linq string null

这是我的代码片段:

var link = socials.Where(p => p.type == Facebook).FirstOrDefault().URL;
Run Code Online (Sandbox Code Playgroud)

问题是列表中没有任何社交对象,FirstOrDefault()返回null.URL触发异常.

如何在LINQ的"one"行中避免这种情况?因此,如果null返回空""(或自定义更好)字符串,否则.URL

Tim*_*ter 41

您可以使用DefaultIfEmpty参数指定回退值:

var link = socials
    .Where(p => p.type == Facebook)
    .Select(p => p.Url)
    .DefaultIfEmpty("")
    .First();
Run Code Online (Sandbox Code Playgroud)

FirstOrDefault不再是必需的,它是安全的使用FirstDefaultIfEmpty.

  • 是的,这是`DefaultIfEmpty`的唯一目的.只有在序列不包含元素时才会发挥作用.然后它使用类型的默认值或 - 如果你在我的答案中使用重载 - 它使用提供的值.因此具有相同的结果,就好像序列只包含一个具有该值的元素. (3认同)

Pet*_*ith 16

另一种选择是使用null coalesce运算符

var link = (socials
    .Where(p => p.type == Facebook)
    .Select(p => p.Url)
    .FirstOrDefault()) ?? string.empty;
Run Code Online (Sandbox Code Playgroud)

我明白这string.empty是首选,""但可能不是这种情况 - 请参阅下面的评论.

更新 在C#6中有一个空条件运算符(也称为"Elvis"运算符):

var link = socials
    .Where(p => p.type == Facebook)
    .Select(p => p.Url)
    .FirstOrDefault()?.URL ?? string.empty;
Run Code Online (Sandbox Code Playgroud)

一个简单的例子:

stringbuilder sb = null;
// do work
string s = sb?.ToString() ?? "no values found"; 
Run Code Online (Sandbox Code Playgroud)

  • 为什么`string.empty`优于``"`?Tha只是个人喜好的问题.Imo"""很清楚. (5认同)
  • 你和我的答案之间有一个微妙的区别.如果没有`type == facebook`,并且第一个匹配的`Url`是'null`,你会得到`String.Empty`.[我的方法](http://stackoverflow.com/a/32138070/284240)在这种情况下仍会产生"null". (2认同)

kjb*_*tel 6

使用C#6,如果从LINQ语句返回的对象不是,即如果找到了值,则可以使用空条件operator(?.)返回URL null,或者使用nullotherwsie.

var link = socials.Where(p => p.type == Facebook).FirstOrDefault()?.URL;
Run Code Online (Sandbox Code Playgroud)

如果您想要将null值更改为空字符串或自定义字符串,请使用null-coalescing运算符(??).

var link = socials.Where(p => p.type == Facebook).FirstOrDefault()?.URL ?? "No URL";
Run Code Online (Sandbox Code Playgroud)

应该注意的是,这不会区分是找不到对象还是找到了对象但是有nullURL值.