|
|
連載:[完全版]究極のC#プログラミング
Chapter3 新しい繰り返しのスタイル ― yield return文とForEachメソッド
川俣 晶
2009/08/31 |
|
|
3.2 数を数えるというサンプル
ここでは指定した数を順番に数える列挙オブジェクトをサンプルに使ってみよう。これは、たとえば、「0から9まで」と指定すると、0、1、2、3、4、5、6、7、8、9という整数の列を作り出す、というものである。元データなしで無から列挙対象を創出することになるので、データをコレクションに入れて列挙すればよい……という対処方法が採れない題材である。
ここまで読んで、「実用性のないサンプルのためのサンプルか……」と思った読者は考えを改めていただきたい。実は、この題材は、自由度が高すぎるfor文に対する1つの処方箋になる。
たとえば、次のような変数名の書き間違いがfor文にはありうることをすでに書いた。
for ( i = 0; i <= 9; j++ )
{
…
}
|
|
しかし、1つの変数を使って一定回数を数えるのはプログラムでよく見る書き方である。Visual BasicのFor文なら、確実に1つの変数を使ってカウントしてくれる。
だが、いまさら新しい構文を言語に増やすのも面倒な話である。既存の構文を使って、うまくやる方法はないだろうか? その答えの1つが、数を数える列挙オブジェクトである。
たとえばRubyには、言語にビルドインされたそのようなオブジェクトが存在する。次の例は、0から9まで数えるオブジェクトを生成し、それによって変数iを0から9まで変化させながら繰り返す構文である。
同様の機能は.NET Framework 3.5のSystem.Linq.Enumerable.Rangeメソッドとしても提供されている。これを使えばC# 3.0でも同じことが容易に記述できる。
foreach (int i in Enumerable.Range(0, 10))
{
…
}
|
|
余談だが、1つだけ補足しておこう。ここでRubyを説明の例に出したのは、この機能が言語にビルドインされているRubyのほうが優秀な言語であり、C#は努力によってRubyに近づくことができる……という主張をするためではない。Rubyは面白い言語ではあるが、本来の能力から見ると、最近の社会的な評価は過剰に高すぎるという印象がある。逆に、C#は本来の能力から見ると、社会的な評価が過剰に低すぎる感がある。筆者の漠然とした印象からいえば、個別の機能ではなく総合力で見た場合、RubyよりもC# 3.0のほうがはるかに強力であり、実用性は高いと思われる。ここで重要なことは、このような列挙機能が標準で提供されていることではない。そうではなく、誰でも簡単に思いどおりの列挙機能を記述できるという点である。決まり切ったパターンを言語の中に組み込むよりも、その場に応じて必要な機能を手軽に記述できるほうがずっとパワフルで役に立つ。
では、これと同じ列挙機能を持つオブジェクトを、C#で作成してみよう。たとえば、Rangeというクラス名だとすれば、次のように記述して同じ機能を得ることができるRangeクラスを記述することを題材にしてみる。
foreach (int i in new Range(0, 9))
{
…
}
|
|
Insider.NET 記事ランキング
本日
月間