Using .ToDictionary()
I have a method returning a List, let's call it GetSomeStrings()
.
I have an extension method on string class, returning number of characters in the string, eg. myString.Number('A')
.
I would like to, in a single line, grab a dictionary. An entry of the dictionary contains the string, and the number of a chosen character in the string.
Actually I do the following:
var myDic = GetSomeStrings().ToDictionary(x=>x.Number('A'));
which gives me a dictionary <int,string>
; I would like the key as the string.
After, I'd like to order the dictionary on the int value. It is possible to include this in the previous statement ?
I'd really like to avoid a collection enumeration to sort or create the dictionary from the list, which is what i do actually without troubles. Thank you for your optimization help !
Edit
The ToDictionary()
method has an overload that takes two lambda expressions (nitpick: delegates); one for the key and one for the value.
For example:
var myDic = GetSomeStrings().ToDictionary(x => x, x => x.Number('A'));
Note that the values returned by GetSomeStrings()
must be unique.
.Net's Dictionary<TKey, TValue>
is unordered; it cannot be sorted at all.
Instead, you can sort the dictionary when you use it, like this:
foreach(KeyValuePair<string, int> kvp in dict.OrderBy(kvp => kvp.Value))
A regular Dictionary is not sorted, but you can use a SortedDictionary:
var sortedDict = new SortedDictionary<string, int>(
GetSomeStrings().ToDictionary(x => x, y => y.Number('A')));
That should give you a SortedDictionary<string, int> sorted by the string key.