Sort
Dictionary
Dictionary
has no Sort
method. If we need to loop through the Dictionary
contents in sorted order, we must separately acquire the elements and sort them.
We can sort a Dictionary
with the Keys
and Values properties and a List
instance. Some approaches are slower than others.
To begin, we sort the string
keys in a Dictionary
. In the output, the string
"apple" should come before the string
"zebra."
Dictionary
is created. The var
implicit typed keyword is used to reduce syntactic redundancy.Keys
property. Then we use the ToList
extension method and the Sort
instance method.List
is looped through using the foreach
-loop construct. We print each key and its value.using System; using System.Collections.Generic; using System.Linq; // Step 1: create dictionary. var dictionary = new Dictionary<string, int>(); dictionary.Add("car", 2); dictionary.Add("zebra", 0); dictionary.Add("apple", 1); // Step 2: get keys and sort them. var list = dictionary.Keys.ToList(); list.Sort(); // Step 3: loop through keys. foreach (var key in list) { Console.WriteLine("{0}: {1}", key, dictionary[key]); }apple: 1 car: 2 zebra: 0
Sort
valuesThis program adds keys to a Dictionary
and then sorts them by their values. Dictionary
instances are not initially sorted. We use the orderby
keyword in a query statement.
string
keys, and int
values. We will reorder the values to go from lowest to highest.foreach
to iterate through and display each KeyValuePair
. No additional lookups are required.using System; using System.Collections.Generic; using System.Linq; // Example dictionary. var dictionary = new Dictionary<string, int>(5); dictionary.Add("cat", 1); dictionary.Add("dog", 0); dictionary.Add("mouse", 5); dictionary.Add("eel", 3); dictionary.Add("programmer", 2); // Order by values. // ... Use LINQ to specify sorting by value. var items = from pair in dictionary orderby pair.Value ascending select pair; // Display results. foreach (KeyValuePair<string, int> pair in items) { Console.WriteLine("{0}: {1}", pair.Key, pair.Value); } // Reverse sort. // ... Can be looped over in the same way as above. items = from pair in dictionary orderby pair.Value descending select pair;dog: 0 cat: 1 programmer: 2 eel: 3 mouse: 5
OrderBy
Another option is the OrderBy
extension method in System.Linq
. This approach compiles to the same code as the orderby
query expression.
KeyNotFoundException
. We can trap those errors with exception handling.using System; using System.Collections.Generic; using System.Linq; var items = new Dictionary<int, int>(); items.Add(-1, 0); items.Add(0, 1); items.Add(-2, 0); items.Add(3, 1); // Use OrderBy method. foreach (var item in items.OrderBy(i => i.Key)) { Console.WriteLine(item); }[-2, 0] [-1, 0] [0, 1] [3, 1]
Other methods I found involve more steps, code or complexity. There is nothing wrong with those methods, although they vary in efficiency.
Sort
string
valuesSorting strings would work just as well. Sort()
uses the interface
implementations of the types. Its syntax is the same for any type that List.Sort()
could sort.
Dictionary
is optimized for fast lookups, not for specific looping mechanisms. It helps in lookup-heavy programs, but hinders programs that require sorted keys.