Você não classifica entradas no dicionário. A classe de dicionário no .NET é implementada como uma hashtable - essa estrutura de dados não pode ser classificada por definição.
Se você precisar interagir com sua coleção (por chave) - precisará usar o SortedDictionary, que é implementado como uma Árvore de Pesquisa Binária.
No seu caso, no entanto, a estrutura de origem é irrelevante, porque é classificada por um campo diferente. Você ainda precisará classificá-lo por frequência e colocá-lo em uma nova coleção classificada pelo campo relevante (frequência). Portanto, nesta coleção, as frequências são chaves e as palavras são valores. Como muitas palavras podem ter a mesma frequência (e você a usará como chave), você não pode usar nem o Dictionary nem o SortedDictionary (eles exigem chaves exclusivas). Isso deixa você com uma SortedList.
Não entendo por que você insiste em manter um link para o item original em seu dicionário principal / primeiro.
Se os objetos em sua coleção possuírem uma estrutura mais complexa (mais campos) e você precisar acessá-los / classificá-los com eficiência usando vários campos diferentes como chaves - Você provavelmente precisará de uma estrutura de dados personalizada que consistir no armazenamento principal que suporta inserção e remoção de O (1) (LinkedList) e várias estruturas de indexação - Dictionaries / SortedDictionaries / SortedLists. Esses índices usariam um dos campos da sua classe complexa como uma chave e um ponteiro / referência para o LinkedListNode no LinkedList como um valor.
Você precisaria coordenar inserções e remoções para manter seus índices sincronizados com a coleção principal (LinkedList) e as remoções seriam muito caras, eu acho. É semelhante à maneira como os índices de banco de dados funcionam - eles são fantásticos para pesquisas, mas se tornam um fardo quando você precisa executar várias inserções e exclusões.
Todas as opções acima só são justificadas se você deseja fazer algum processamento pesado de consulta. Se você precisar produzi-los apenas uma vez classificados por frequência, poderá produzir uma lista de tuplas (anônimas):
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
que faça o truque (é verdade que ele aceita uma chave para comparar, mas com uma chave, você pode obter um valor). ;-)