Managed C++ Enumerator

Last-modified: 2007-12-31 (月) 16:09:12

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チェックだけしておけばいい