|  |  | 
 
| 連載:[完全版]究極のC#プログラミングChapter3 新しい繰り返しのスタイル ― yield return文とForEachメソッド川俣 晶2009/08/31
 |  | 
| 
 | 
3.11 ForEachメソッドを使う別解
 ……とまあここまですばらしいC# 3.0の反復子について見てきたわけだが、実は、C# 3.0にはもう1つの画期的な繰り返し方法が提供されている。といっても、言語仕様が拡張されているわけではない。コレクションのクラスで「ForEachメソッド」が利用できるようになったのである。
 アイディアは簡単で、繰り返しを行うメソッドを用意し、繰り返し1回ごとに実行するメソッドをデリゲート型経由で渡せるようにしただけである(リスト3.12参照)。
| 
 
| using System;
 class Program
 {
 static void Main(string[] args)
 {
 int[] array = { 1, 2, 3 };
 int sum = 0;
 
 Array.ForEach<int>(array, (i)=>
 {
 sum += i;
 });
 Console.WriteLine(sum);
 // 出力:6
 }
 }
 
 |  | 
| リスト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参照)。
| 
 
| using System;
 class Range
 {
 public static void ForEach(int from, int to, Action<int> action)
 {
 for (int i = from; i <= to; i++) action(i);
 }
 }
 
 class Program
 {
 static void Main(string[] args)
 {
 Range.ForEach(0, 9,(i)=>
 {
 Console.Write("{0} ", i);
 }
 );
 // 出力:0 1 2 3 4 5 6 7 8 9
 }
 }
 
 |  | 
| リスト3.13 リスト3.2に相当するコードをForEachメソッドで記述したもの | 
 このとおり、何も難しいことはない。内容も簡潔である。
 
 
 
	
		Insider.NET 記事ランキング
		
		
			本日
			月間