Was this page helpful?
Your feedback about this content is important. Let us know what you think.
Additional feedback?
1500 characters remaining
Export (0) Print
Expand All
Important This document may not represent best practices for current development, links to downloads and other resources may no longer be valid. Current recommended version can be found here.

How to: Iterate Over a User-Defined Collection with for each

For a class to be a managed collection, it needs a non-private GetEnumerator function that returns a handle to an Enumerator class or an interface. An enumerator class must contain the declaration for non-static MoveNext function and Current property.

Example

Simple user defined collection with reference types.

// 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;
}

Output

Return Code: 0

See Also

Reference

for each, in

Community Additions

ADD
Show:
© 2015 Microsoft