連載:[完全版]究極のC#プログラミングChapter3 新しい繰り返しのスタイル ― yield return文とForEachメソッド川俣 晶2009/08/31 |
|
|
3.11 ForEachメソッドを使う別解
……とまあここまですばらしいC# 3.0の反復子について見てきたわけだが、実は、C# 3.0にはもう1つの画期的な繰り返し方法が提供されている。といっても、言語仕様が拡張されているわけではない。コレクションのクラスで「ForEachメソッド」が利用できるようになったのである。
アイディアは簡単で、繰り返しを行うメソッドを用意し、繰り返し1回ごとに実行するメソッドをデリゲート型経由で渡せるようにしただけである(リスト3.12参照)。
| |
リスト3.12 配列に対するForEachメソッドの利用例 |
ここで使用しているArrayクラス(System名前空間)のForEach<T>メソッドは、第1引数の配列のすべての要素に対して、第2引数のデリゲートを呼び出す機能を持つ。
このようなメソッドはC# 1.xの時代にも容易に記述できたが、やはり実用性が出てきたのはラムダ式(あるいは匿名メソッド)が使えるようになったC# 2.0以降だろう。ラムダ式なら、上位のブロックのスコープに属するので、上記のサンプルコードのように変数sumに値を積算することも容易にできる。ラムダ式については、詳しくは第6章、第7章で解説しているが、第1章でも簡単に解説しているので、ここではそれを参考にしていただきたい。
当然のことながら、ForEachメソッドの自作も容易である。
リスト3.2に相当するコードを、ForEachメソッドを自作することによって実現してみよう(リスト3.13参照)。
| |
リスト3.13 リスト3.2に相当するコードをForEachメソッドで記述したもの |
このとおり、何も難しいことはない。内容も簡潔である。
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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|