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 つの特定の要素を返します。
追記:
コメント欄で教えて貰ったので、そちらを利用した場合のサンプルも作成してみました。
Singleメソッドの中に条件を記述できる。
var test = Enumerable.Range(1,10).Single(x => x == 5); Console.Write(test);
明らかに、簡潔に記述できて楽ですね。
Whereであることを明示するか、Singleの中に記述するか迷うところではあります。
SignleOrDefaultメソッドを利用する。
シーケンスの 1 つの特定の要素を返します。そのような要素が見つからない場合は既定値を返します。
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なので、利用しやすいかもしれません。