http://msdn2.microsoft.com/ja-jp/library/system.collections.ienumerable.getenumerator.aspx
概念
Enumeratorは、つまり列挙するもの。
コンテナに対するイテレータのようなもの。
あるコレクションの要素を列挙したい場合に使う。
使い方
列挙の仕方
とりあえず、「GetEnumerator()」というメンバがあるクラスに対して
System::Collections::IEnumerator * enm = container->GetEnumerator();
として、Enumeratorを得る。
ここで得たenmは、コレクションの先頭を指していない。
コレクションの先頭要素よりも1つ前を指している。
そこで次のようにして、先頭要素を得ることが出来る。
enm->MoveNext();
これで、enmは先頭要素を指す。
なぜ、こんな仕様なのかというと
Enumeratorは、次のような使い方を想定しているからである。
System::Collections::IEnumerator * enm = container->GetEnumerator(); while ( enm->MoveNext() ) { // do something }
値の取り出し方 (1)
列挙できるようになったら、実際の値を取り出してみたくなる。
このときは、次のように行う。
System::Collections::IEnumerator * enm = container->GetEnumerator(); while ( enm->MoveNext() ) { // Tは目的のデータの型。 T* value = __try_cast<T* >(enm->Current); }
値の取り出し方 (2)
もうひとつの方法として、以下のようにコンテナのインデックスを得る方法がある。
System::Int32 index = container->IndexOf( enm->Current );
この方法だと、System::Collections::ArrayListのようにジェネリッククラスには
使えないがSystem::Xml::XmlNodeListのようなものであれば分かりやすく使えるかもしれない。
ただし、他コレクションへの可搬性が落ちると思われる。
注意点
- Enumeratorはコレクションが変更されると無効になる
- GetEnumeratorしたコレクションが空の場合、最初のMoveNext()の戻り値がfalseとなるので、nullチェックだけしておけばいい