6.7. Implementing Nested foreach Functionality in a Class

Problem

You need a class that contains a list of objects, with each of these objects containing a list of objects. You want to use a nested foreach loop to iterate through all objects in both the outer and inner lists in the following manner:

	foreach (Group<Item> subGroup in topLevelGroup)
	{
	    // do work for groups
	    foreach (Item item in subGroup)
	    {
	        // do work for items
	    }
	}

Solution

Implement the IEnumerable<T> interface on the class. The Group class shown in Example 6-3 contains a List<T> that can hold Group objects, and each Group object contains a List<Item>.

Example 6-3. Implementing foreach functionality in a class

using System;
using System.Collections;
using System.Collections.Generic;

public class Group<T> : IEnumerable<T>
{
    public Group(string name)
    {
        this.Name = name;
    }

    private List<T> _groupList = new List<T>();

    public string Name { get; set; }

    public int Count
    {
        get { return _groupList.Count; }
    }

    public void Add(T group)
    {
        _groupList.Add(group);
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }

    public IEnumerator<T> GetEnumerator()
    {
        return _groupList.GetEnumerator();
    }
}

public class Item
{
    public Item(string name, int location)
    {
        this.Name = name;
        this.Location = location;
    }
    public string Name { get; set; }
    public int Location { get; set; }
}

Discussion

Building functionality into a class to allow it to be iterated over using the foreach loop is much easier using iterators in the C# language. In previous ...

Get C# 3.0 Cookbook, 3rd Edition 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.