Singleメソッドを使うことで単一の要素を返せる事を知った

LINQを使って書くときに結果が必ず1件になることが分かっているのに今まで

var test = Enumerable.Range(1,10).Where(x => x == 5).Select(x => x);
Console.Write(test[0]);

とSelectメソッドを利用した上で、配列としてアクセスしていたが、MSDNを見て(というかインテリセンスでそれっぽいのを見つけてMSDNにアクセスして確認して)いたらSingleメソッドというものを見つけた。

どうも要素が一つに限定される場合はSelectの代わりにSingleメソッドを利用する事で「要素が一つの配列」としてではなく、単一の要素とする結果になるらしい。

という事で、

var test = Enumerable.Range(1,10).Where(x => x == 5).Single();
Console.Write(test);

と書いてみたら配列ではなく単一のint型の変数としてアクセスすることができた。

ちゃんと、いろいろと試してみないといけないなぁと思った。

シーケンスの 1 つの特定の要素を返します。

Queryable.Single メソッド (System.Linq)

追記:

コメント欄で教えて貰ったので、そちらを利用した場合のサンプルも作成してみました。

Singleメソッドの中に条件を記述できる。

var test = Enumerable.Range(1,10).Single(x => x == 5);
Console.Write(test);

明らかに、簡潔に記述できて楽ですね。

Whereであることを明示するか、Singleの中に記述するか迷うところではあります。

SignleOrDefaultメソッドを利用する。

シーケンスの 1 つの特定の要素を返します。そのような要素が見つからない場合は既定値を返します。

Queryable.SingleOrDefault メソッド (System.Linq)

var test = Enumerable.Range(1, 10).SingleOrDefault(x => x == 15);
if (test == 0)
{
MessageBox.Show("存在しない。");
}
else
{
MessageBox.Show(test.ToString());
}

こちらは、要素が存在しない時は、要素にあたる型の規定値を返します。

intの場合は0なので、上記のサンプルの場合0だったら要素が存在しなかったことになります。

0も範囲内に含まれているような状況だと判断に困りますが、Null許容型や参照型は規定値がNullなので、利用しやすいかもしれません。

Share