Sözlükteki girişleri sıralamazsınız. .NET'teki sözlük sınıfı karma olarak uygulanır - bu veri yapısı tanım gereği sıralanabilir değildir.
Koleksiyonunuz üzerinde yineleme yapabilmeniz gerekiyorsa (anahtar ile) - İkili Arama Ağacı olarak uygulanan SortedDictionary'yı kullanmanız gerekir.
Ancak sizin durumunuzda, kaynak yapı önemsizdir, çünkü farklı bir alana göre sıralanmıştır. Yine de frekansa göre sıralamanız ve ilgili alana (frekans) göre sıralanmış yeni bir koleksiyona koymanız gerekir. Yani bu koleksiyonda frekanslar anahtarlar ve kelimeler değerlerdir. Birçok kelime aynı frekansa sahip olabileceğinden (ve bunu anahtar olarak kullanacağınızdan) ne Dictionary ne de SortedDictionary kullanamazsınız (benzersiz anahtarlar gerektirir). Bu size bir SortedList bırakır.
Ana / ilk sözlüğünüzdeki orijinal öğeye bir bağlantıyı sürdürmek konusunda neden ısrar ettiğinizi anlamıyorum.
Koleksiyonunuzdaki nesneler daha karmaşık bir yapıya sahipse (daha fazla alan) ve anahtar olarak birkaç farklı alanı kullanarak bunlara verimli bir şekilde erişebilmeniz / bunları sıralayabilmeniz gerekiyorsa - Büyük olasılıkla, O (1) ekleme ve kaldırma (LinkedList) ve çeşitli indeksleme yapılarını destekler - Sözlükler / SortedDictionaries / SortedLists. Bu dizinler, bir anahtar olarak karmaşık sınıfınızdaki alanlardan birini ve bir değer olarak LinkedList'teki LinkedListNode öğesine bir işaretçi / başvuru kullanır.
Ana koleksiyon (LinkedList) ile senkronize tutmak için eklemeler ve kaldırma koordine gerekir ve kaldırma sanırım oldukça pahalı olurdu. Bu, veritabanı dizinlerinin çalışma şekline benzer - aramalar için harikalar, ancak birçok insetion ve silme işlemi yapmanız gerektiğinde bir yük haline gelirler.
Yukarıdakilerin tümü, ancak bazı ağır arama işlemleri yapacaksanız haklıdır. Bunları yalnızca frekansa göre sıralandığında bir kez çıkarmanız gerekiyorsa, (anonim) grupların bir listesini üretebilirsiniz:
var dict = new SortedDictionary<string, int>();
// ToDo: populate dict
var output = dict.OrderBy(e => e.Value).Select(e => new {frequency = e.Value, word = e.Key}).ToList();
foreach (var entry in output)
{
Console.WriteLine("frequency:{0}, word: {1}",entry.frequency,entry.word);
}
IComparer
hile yapan bir tane oluşturabilirsiniz (karşılaştırmak için bir anahtarı kabul ettiği doğrudur, ancak bir anahtarla bir değer elde edebilirsiniz). ;-)