2012-01-13 6 views
35

DefaultIfEmpty()がどのように使用できるか説明できますLINQ私はいくつかの素材を用意していますが、それが何であるかを見るためにはまだ何かが必要です。LINQのDefaultIfEmpty

+1

あなたはその使用法について理解していませんか? – Oded

+3

私はあなたがそれを使うのかどうか本当に分かりません。 'IEnumerable 'を返しますので、 '.DefaultIfEmpty()。First()'を使用した場合は '.FirstOrDefault()'と同じです。[MSDNの例](http://msdn.microsoft。 com/ja-us/library/bb360179.aspx)は本当に悪いです。 – Ryan

+1

あなたは 'if(x!= null)'テストでコードを分割する必要はありません。 – ChrisF

答えて

37

基本的に、ソースコレクションが空の場合に単一要素のコレクションを返します。

var numbers = new int[] {1, 2, 3}; 
var aNumber = numbers.First(); 

リターン1

しかし

var numbers = new int[]; 
var aNumber = numbers.DefaultIfEmpty(12).Single(); 

戻っ12コレクションが空であるよう

+0

ああ、大丈夫です。あなたが '.FirstOrDefault(12)'を代わりにすることはできない、少し愚かです。 – Ryan

+3

DefaultIfEmptyは要素を返しますが、DefaultIfEmptyは、チェーン内の別のlinq操作にカスケードすることができるコレクションを返します。 –

+5

@ vc74:最初の 'DefaultIfEmpty'は(あなたのコメントの)' FirstOrDefault'になったのですか? – Chris

7

差はFirstOrDefaultオブジェクトを返しながらDefaultIfEmptyは、オブジェクトのコレクションを返しています。結果が見つからない場合、DefaultIfEmptyはデフォルト値を持つ単一の項目を持つEnumerableを返しますが、FirstOrDefaultはT自体を返します。

外部結合を作成するなど、常にコレクション結果が必要な場合は、DefaultIfEmptyを使用します。 IDや固有の電子メールのようなものを検索するときに最初のアイテム(またはアイテムのみ)を取得したい場合など、オブジェクト(コレクションではない)の結果が常に必要な場合はFirstOrDefaultを使用し、デフォルトの空のアイテムあなたが探していたものが見つからなかった場合。