using System.Collections.Generic;
public static void Main()
var d = new KeyLengthSortedDictionary(){
foreach(string key in d.Keys) {
Console.WriteLine("Key {0} Value {1}", key, d[key]);
Console.WriteLine("Decending...");
var dd = new KeyLengthSortedDecendingDictionary(){
foreach(string key in dd.Keys) {
Console.WriteLine("Key {0} Value {1}", key, dd[key]);
public class KeyLengthSortedDictionary : SortedDictionary<string, string>
private class StringLengthComparer : IComparer<string>
public int Compare(string x, string y)
if (x == null) throw new ArgumentNullException(nameof(x));
if (y == null) throw new ArgumentNullException(nameof(y));
var lengthComparison = x.Length.CompareTo(y.Length);
return lengthComparison == 0 ? string.Compare(x, y, StringComparison.Ordinal) : lengthComparison;
public KeyLengthSortedDictionary() : base(new StringLengthComparer()) { }
public class KeyLengthSortedDecendingDictionary : SortedDictionary<string, string>
private class StringLengthComparer : IComparer<string>
public int Compare(string x, string y)
if (x == null) throw new ArgumentNullException(nameof(x));
if (y == null) throw new ArgumentNullException(nameof(y));
var lengthComparison = x.Length.CompareTo(y.Length) * -1;
return lengthComparison == 0 ? string.Compare(x, y, StringComparison.Ordinal) : lengthComparison;
public KeyLengthSortedDecendingDictionary() : base(new StringLengthComparer()) { }