3.27. Implementing Nested foreach Functionality in a Class

Problem

You need a class that contains an array of objects; each of these objects in turn contains an array of objects. You want to use a nested foreach loop to iterate through all objects in both the outer and inner arrays in the following manner:

foreach (SubSet aSubSet in Set)
{
    foreach (Item i in aSubSet)
    {
        // Operate on Item objects contained in the innermost object collection 
        //  SomeSubSet, which in turn is contained in another outer collection
        //   called Set
    }
}

Solution

Implement IEnumerable on the top-level class as usual, but also implement IEnumerable on each of the objects returned by the top-level enumeration. The following class set contains an ArrayList of SubGroup objects, and each SubGroup object contains an ArrayList of Item objects:

using System; using System.Collections; //----------------------------------------- // // The top-level class // //----------------------------------------- public class Set : IEnumerable { //CONSTRUCTORS public Set( ) {} //FIELDS private ArrayList setArray = new ArrayList( ); //PROPERTIES public int Count { get{return(setArray.Count);} } //METHODS public IEnumerator GetEnumerator( ) { return(new SetEnumerator(this)); } public int AddGroup(string name) { return(setArray.Add(new SubGroup(name))); } public SubGroup GetGroup(int setIndex) { return((SubGroup)setArray[setIndex]); } //NESTED ITEMS public class SetEnumerator : IEnumerator { //CONSTRUCTORS public SetEnumerator(Set theSet) ...

Get C# Cookbook now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.