連載:[完全版]究極の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メソッドで記述したもの

 このとおり、何も難しいことはない。内容も簡潔である。


 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 記事ランキング

本日 月間