#1,117 – foreach Requires IEnumerable Implementation
June 13, 2014 1 Comment
The foreach statement works on an object that implements IEnumerable<T> or IEnumerable. It also works on an object whose type has a public GetEnumerator method that returns an IEnumerator<T> or IEnumerator.
Below, we’ve defined a new class that implements IEnumerable<T>.
public class DogPack : IEnumerable<Dog> { private List<Dog> thePack; public DogPack() { thePack = new List<Dog>(); } public void Add(Dog d) { thePack.Add(d); } // Remove arbitrary dog public void Cull() { if (thePack.Count == 0) return; if (thePack.Count == 1) thePack.RemoveAt(0); else { Random rnd1 = new Random(); int indRemove = rnd1.Next(thePack.Count); thePack.RemoveAt(indRemove); } } // IEnumerable<T> implementation public IEnumerator<Dog> GetEnumerator() { return thePack.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } }
We can now use foreach to iterate on an instance of this class.
DogPack pack = new DogPack(); pack.Add(new Dog("Lassie", 8)); pack.Add(new Dog("Shep", 12)); pack.Add(new Dog("Kirby", 10)); pack.Add(new Dog("Jack", 15)); pack.Cull(); // Who's left? foreach (Dog d in pack) Console.WriteLine(d);