C# Design Patterns: the Iterator pattern
January 23, 2009
Summary
Iterate through a list of items, with an enumerator class ordering the set/list before it is iterated through.
Example
Iterators are built into C# via foreach statements and IEnumerator. The iterator is the foreach statement, which requires the object it is iterating through to implement IEnumerator. The foreach statement calls GetEnumerator on the collection or class you specify. With the introduction of the yield keyword into C# this has been made even simpler.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
namespace DesignPatterns | |
{ | |
private static void IteratorTest() | |
{ | |
IteratorExample example = new IteratorExample(); | |
foreach (string item in example) | |
{ | |
Console.WriteLine(item); | |
} | |
} | |
public class IteratorExample : IEnumerable | |
{ | |
Dictionary<string, string> _dictionary; | |
public IteratorExample() | |
{ | |
// Add 5 names to a key/value pair list. | |
_dictionary = new Dictionary<string, string>(); | |
_dictionary.Add("Hans", "Pisces"); | |
_dictionary.Add("Fred", "Aquarius"); | |
_dictionary.Add("Andrew", "Gemini"); | |
_dictionary.Add("Zach", "Scorpio"); | |
_dictionary.Add("Berfa", "Cancer"); | |
} | |
/// <summary> | |
/// Demonstrates yield with IEnumerable. | |
/// </summary> | |
public IEnumerator GetEnumerator() | |
{ | |
// Sort by name | |
var sorted = from d in _dictionary orderby d.Key select d; | |
// Iterate through the sorted collection | |
foreach (KeyValuePair<string, string> item in sorted) | |
{ | |
yield return item.Key; | |
yield return string.Format("({0})",item.Value); | |
} | |
} | |
} | |
} |
The output is:
Andrew (Gemini) Berfa (Cancer) Fred (Aquarius) Hans (Pisces) Zach (Scorpio)
I'm Chris Small, a software engineer working in London. This is my tech blog. Find out more about me via Github, Stackoverflow, Resume