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なので、利用しやすいかもしれません。