Share via


方法: for each を使用してユーサー定義のコレクションを反復処理する

マネージ コレクションになるクラスに対して列挙子のクラスまたはインターフェイスにハンドルを返す GetEnumerator の非プライベート関数を必要とします。列挙子クラスは、静的ではない MoveNext 関数と現在のプロパティの宣言を含める必要があります。

使用例

参照型の単純なユーザー定義のコレクション。

// for_each_user_defined_collections.cpp
// compile with: /clr
using namespace System;
public interface struct IMyEnumerator {
   bool MoveNext();
   property Object^ Current {
      Object^ get();
   }
   void Reset();
};

public ref struct MyArray {   
   
   MyArray( array<int>^ d ) {
      data = d;
   }

   ref struct enumerator : IMyEnumerator {
      enumerator( MyArray^ myArr ) {
         colInst = myArr;
         currentIndex = -1;
      }

      virtual bool MoveNext() {
         if( currentIndex < colInst->data->Length - 1 ) {
            currentIndex++;
            return true;
         }
         return false;
      }
   
      property Object^ Current {
         virtual Object^ get() {
            return colInst->data[currentIndex];
         }
      };
      
      virtual void Reset() {}
      ~enumerator() {}
         
      MyArray^ colInst;
      int currentIndex;
   };
   
   array<int>^ data;

   IMyEnumerator^ GetEnumerator() {
      return gcnew enumerator(this);
   }
};

int main() {
   int retval = 0;

   MyArray^ col = gcnew MyArray( gcnew array<int>{10, 20, 30 } );
   
   for each ( Object^ c in col )
      retval += (int)c;

   retval -= 10 + 20 + 30;
   
   for each ( int c in gcnew MyArray( gcnew array<int>{10, 20, 30 } ) )
      retval += c;

   retval -= 10 + 20 + 30;
   
   Console::WriteLine("Return Code: {0}", retval );
   return retval;
}
  

参照

関連項目

for each、in