web-dev-qa-db-ja.com

オブジェクトがnullの場合に空の文字列を返す方法は?

これが私のコードのスニペットです:

_var link = socials.Where(p => p.type == Facebook).FirstOrDefault().URL;
_

問題は、リストにソーシャルオブジェクトがなく、FirstOrDefault() return nullであり、_.URL_が例外をトリガーすることです。

LINQとの「1つの」行でこれを回避するにはどうすればよいですか?したがって、nullが空の_""_(またはカスタムのさらに良い)文字列を返す場合、それ以外の場合は_.URL_?

24
markzzz

DefaultIfEmpty を引数とともに使用して、フォールバック値を指定できます。

var link = socials
    .Where(p => p.type == Facebook)
    .Select(p => p.Url)
    .DefaultIfEmpty("")
    .First();

FirstOrDefaultはもう必要ありません。FirstDefaultIfEmptyと一緒に使用しても安全です。

41
Tim Schmelter

別のオプションは、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"; 
16
Peter Smith

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";

これにより、オブジェクトが見つからなかったのか、オブジェクトが見つかったがnullURL値があったのかが区別されないことに注意してください。

6
kjbartel