連載:[完全版]究極の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つの変数を使ってカウントしてくれる。

For i = 0 To 9
   …
Next i

 だが、いまさら新しい構文を言語に増やすのも面倒な話である。既存の構文を使って、うまくやる方法はないだろうか? その答えの1つが、数を数える列挙オブジェクトである。

 たとえばRubyには、言語にビルドインされたそのようなオブジェクトが存在する。次の例は、0から9まで数えるオブジェクトを生成し、それによって変数iを0から9まで変化させながら繰り返す構文である。

for i in 0..9
   …
end

 同様の機能は.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))
{
   …
}


 INDEX
  [完全版]究極のC#プログラミング
  Chapter3 新しい繰り返しのスタイル ― yield return文とForEachメソッド
    1.3.1 「繰り返し」という古くて新しい問題
  2.3.2 数を数えるというサンプル
    3.3.3 C# 1.xによるRangeクラスの実装
    4.3.4 C# 3.0によるRangeクラスの実装
    5.3.5 yield break文による中断
    6.3.6 yieldは予約語ではない
    7.3.7 1つのクラスに複数の列挙機能を付ける
    8.3.8 自動的に作られるオブジェクトと二重利用
    9.3.9 catchできない制約
    10.3.10 制約の真相―見た目と違う真実の姿
    11.3.11 ForEachメソッドを使う別解
    12.3.12 性能比較
 
インデックス・ページヘ  「[完全版]究極のC#プログラミング」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間