foreach

foreach (C# によるプログラミング入門)
http://ufcpp.net/study/csharp/sp_foreach.html
概要、コレクション、IEnumerableインターフェース、foreach文とは、コレクションクラスの自作、パフォーマンス


foreachならforで列挙できないものでも列挙できちゃう。


コレクション
コレクションとは、配列、リスト、辞書など、複数の要素を1つにまとめるクラス(コレクションクラス)。
配列、連結リスト、探査木について。


参考
アルゴリズムとデータ構造
http://ufcpp.net/study/algorithm/index.html


データ構造が変われば読み出しかたも変わるので、IEnumerableインターフェースが用意されてるぞ

// こうやってアクセスするぞ

int[] array = new int[]{1, 3, 5, 7};

IEnumerator e = array.GetEnumerator(); // GetEnumeratorはIEnumeratorインターフェースを返す!
while(e.MoveNext()
{
  int val = (int)e.Current;
  Console.Write("{0}\n", val);
}

IEnumeratorという、列挙子と呼ばれるクラスを作るためのインターフェースについて。


GetEnumerator で取得した列挙子が IDisposable を継承する場合、 ループ終了後に Dispose が呼ばれる。


実は、IEnumerableを実装してないクラスでも、GetEnumeratorを実装したクラスなら、foreachで列挙できる。(duck typing)


コレクションクラスの自作には、次の2つのことをやる。
・IEnumerableを実装する。
・GetEnumeratorがIEnumeratorを返すので、IEnumeratorを実装したクラス(列挙子という)も作る。
けっこう面倒だが、イテレータというやつを利用したら楽になるらしい。


forより少し遅い。ただし、配列に対するforeachなら最適化がかかる。