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.