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なら最適化がかかる。