これが私のコードのスニペットです:
_var link = socials.Where(p => p.type == Facebook).FirstOrDefault().URL;
_
問題は、リストにソーシャルオブジェクトがなく、FirstOrDefault()
return null
であり、_.URL
_が例外をトリガーすることです。
LINQとの「1つの」行でこれを回避するにはどうすればよいですか?したがって、nullが空の_""
_(またはカスタムのさらに良い)文字列を返す場合、それ以外の場合は_.URL
_?
DefaultIfEmpty
を引数とともに使用して、フォールバック値を指定できます。
var link = socials
.Where(p => p.type == Facebook)
.Select(p => p.Url)
.DefaultIfEmpty("")
.First();
FirstOrDefault
はもう必要ありません。First
をDefaultIfEmpty
と一緒に使用しても安全です。
別のオプションは、null合体演算子を使用することです
var link = (socials
.Where(p => p.type == Facebook)
.Select(p => p.Url)
.FirstOrDefault()) ?? string.empty;
string.empty
が""
よりも優先されることを理解しましたが、そうではない場合があります。以下のコメントを参照してください。
[〜#〜] update [〜#〜] C#6には、null条件演算子(「エルビス」演算子とも呼ばれます)があります。
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";
C#6を使用すると、 null-条件演算子 (?.
)LINQステートメントから返されたオブジェクトがnull
でない場合、つまり値が見つかった場合、またはnull
otherwsieの場合、URLを返します。
var link = socials.Where(p => p.type == Facebook).FirstOrDefault()?.URL;
次に、null
値を空の文字列またはカスタム文字列に変更する場合は、 null合体演算子 (??
)。
var link = socials.Where(p => p.type == Facebook).FirstOrDefault()?.URL ?? "No URL";
これにより、オブジェクトが見つからなかったのか、オブジェクトが見つかったがnull
URL値があったのかが区別されないことに注意してください。