以下是我的代码片段:
FirstOrDefault()
问题是列表中没有任何社交对象,null
返回.URL
,""
会触发异常。
我怎样才能在" one"与LINQ一致?因此,如果null返回空.URL
(或自定义更好)字符串,否则{{1}}?
答案 0 :(得分:41)
您可以将DefaultIfEmpty
与参数一起使用以指定回退值:
var link = socials
.Where(p => p.type == Facebook)
.Select(p => p.Url)
.DefaultIfEmpty("")
.First();
FirstOrDefault
不再需要了,First
与DefaultIfEmpty
一起使用是安全的。
答案 1 :(得分:16)
另一种选择是使用null coalesce operator
var link = (socials
.Where(p => p.type == Facebook)
.Select(p => p.Url)
.FirstOrDefault()) ?? string.empty;
我了解string.empty
比""
更受欢迎,但可能不是这种情况 - 请参阅下面的评论。
<强>更新强> 在C#6中,有一个空条件运算符(也称为“Elvis”运算符):
var link = socials
.Where(p => p.type == Facebook)
.Select(p => p.Url)
.FirstOrDefault()?.URL ?? string.empty;
一个简单的例子:
stringbuilder sb = null;
// do work
string s = sb?.ToString() ?? "no values found";
答案 2 :(得分:6)
使用C#6,如果从LINQ语句返回的对象不是?.
,则可以使用ReportAllocs
(null
)返回URL,即如果找到了值,或null
otherwsie。
var link = socials.Where(p => p.type == Facebook).FirstOrDefault()?.URL;
如果您想将null
值更改为空字符串或自定义字符串,请使用null-conditional operator(??
)。
var link = socials.Where(p => p.type == Facebook).FirstOrDefault()?.URL ?? "No URL";
应该注意的是,这不会区分是找不到对象还是找到了一个对象但是有一个null
URL值。