|
|
連載:[完全版]究極の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 記事ランキング
本日
月間