ComboBoxに連番(例えば、月選択用に1~12)をセットしたい。
最初にやってみたこと
cb.Items.AddRange(Enumerable.Range(1,12).ToArray());
と書いたら受け付けてくれなかった。要はItemCollection.AddRange()
はobject[]
を受け付けるが、int[]
はobject[]
じゃなくobject
なんですな。
次にやってみたこと
じゃあ、Enumerable<int>
のそれぞれの要素をobject
にキャストしちゃえばいいんじゃない?って書いてみたのがこれ。
cb.Items.AddRange(Enumerable.Range(1,12).Cast<object>().ToArray());
ちょっと不格好。
考えを変えてみた
Combobox.Items
にobject
を追加していくというアプローチからCombobox.DataSource
に入れるというアプローチに変えてみた。
cb.DataSource = Enumerable.Range(1,12).ToList();
結果的には、これで良かった。ちなみに、これはList<object>
でもArray<object>
でもいい。(IList
インターフェースを要求するのでEnumerable<object>
ではだめ。)
ここではショートコードプログラミングの流儀に従って短い方を選んでいる。
まあ、月ならリソースで持ってもいいのだけど、年は5年前から10年後なんて形だとこういう形で生成せざるを得ない。そういうのでも
Enumerable.Range(DateTime.Today.Year-5, 15)
で簡単に解決できる。for
はできるだけ使わない。