C-Sharp | Java | Python | Swift | GO | WPF | Ruby | Scala | F# | JavaScript | SQL | PHP | Angular | HTML
These are accessed through the foreach-loop and the GetEnumerator method. We demonstrate the GetEnumerator method. It exhibits better performance than foreach.
Example. Let's examine the most common way to loop through a Dictionary instance. The foreach-loop here actually compiles into intermediate language that uses the GetEnumerator method, MoveNext, and Current—as well as a try-finally block.
Looping over Dictionary with foreach: C# static int A(Dictionary<string, int> d) { int a = 0; foreach (var pair in d) { a += pair.Value; } return a; }
Example 2. Next, this method directly demonstrates the GetEnumerator and MoveNext methods and the Current property. This code is compiled to the same intermediate language except the try-finally block is absent.
Difference: Method B is harder to read and it also omits the try-finally construct that was added by the C# compiler.
Looping over Dictionary with GetEnumerator: C# static int B(Dictionary<string, int> d) { int b = 0; var enumerator = d.GetEnumerator(); while (enumerator.MoveNext()) { var pair = enumerator.Current; b += pair.Value; } return b; }
Performance. I tested the two methods. The benchmark harness is available in the link below. The dictionary initialization code is shown below as well. And finally we see that method B was faster by a fairly constant amount.
Benchmark ProgramsVar Examples
Dictionary initialization: C# var d = new Dictionary<string, int>(); d["one"] = 1; d["two"] = 2; d["three"] = 3; d["four"] = 4; d["five"] = 5; Results Method A (foreach): 92.07 ns Method B (GetEnumerator): 88.53 ns
Summary. Using GetEnumerator directly is somewhat faster than using the foreach-loop on Dictionary. The finally statement actually calls the enumerators Dispose method, which has an empty implementation.
Thus: GetEnumerator is worth considering as a way to improve Dictionary performance in certain C# programs.