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不再是必需的,它是安全的使用First与DefaultIfEmpty.
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)
使用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值.