Ordenação de dicionário por valor em C#: guia completo com exemplos

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Por que ordenar um dicionário por valor é uma dor de cabeça (e como resolvê-la)

\n\n

Você já se deparou com esta situação: você tem um Dictionary<string, int> com dezenas de entradas e precisa exibi-las em ordem decrescente de popularidade? Por exemplo, uma lista das palavras mais frequentes em um texto ou o top 10 de produtos por vendas. Parece uma tarefa simples, mas o Dictionary padrão em C# armazena dados em ordem arbitrária. No Stack Overflow, a pergunta "How do you sort a dictionary by value?" tem milhares de visualizações — e não é por acaso.

\n\n

Neste tutorial, abordaremos todas as formas legais de ordenar um Dictionary por valor em C#: desde um simples truque com LINQ até a criação de seu próprio dicionário ordenado. Você descobrirá qual método escolher para obter o máximo de desempenho e legibilidade de código.

\n\n

Por que o Dictionary não se ordena sozinho?

\n\n

Antes de mergulharmos no código, vamos entender a natureza do Dictionary<TKey, TValue>. Este tipo de dado é uma tabela hash. Ele é otimizado para busca rápida por chave, e não para armazenar elementos em uma ordem específica. Quando você adiciona um elemento, ele é colocado em um "balde" com base no hash da chave. Nenhuma ordenação ocorre.

\n\n

Se você precisa de uma saída ordenada — terá que intervir manualmente. A boa notícia: o C# oferece várias soluções elegantes.

\n\n

Método 1: LINQ — a forma mais popular (como na resposta do Stack Overflow)

\n\n

A abordagem mais simples e mais usada é utilizar LINQ e os métodos OrderBy ou OrderByDescending. Esta opção é ideal quando você precisa ordenar os dados uma única vez para exibição ou exportação.

\n\n
using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nvar fruits = new Dictionary<string, int>\n{\n    {"apple", 5},\n    {"banana", 3},\n    {"orange", 8},\n    {"grape", 1}\n};\n\n// Ordenação crescente pelo valor\nvar sortedAsc = fruits.OrderBy(pair => pair.Value);\n\n// Ordenação decrescente pelo valor\nvar sortedDesc = fruits.OrderByDescending(pair => pair.Value);\n\nConsole.WriteLine("Crescente:");\nforeach (var item in sortedAsc)\n{\n    Console.WriteLine($"{item.Key}: {item.Value}");\n}\n\nConsole.WriteLine("\\nDecrescente:");\nforeach (var item in sortedDesc)\n{\n    Console.WriteLine($"{item.Key}: {item.Value}");\n}
\n\n

Resultado:

\n
Crescente:\ngrape: 1\nbanana: 3\napple: 5\norange: 8\n\nDecrescente:\norange: 8\napple: 5\nbanana: 3\ngrape: 1
\n\n

Como funciona?

\n

OrderBy retorna um IOrderedEnumerable<KeyValuePair<string, int>> — uma sequência que é ordenada "de forma preguiçosa" (apenas na primeira iteração). Isso não é um novo dicionário, mas uma projeção. Se você precisar salvar o resultado, converta-o de volta para um dicionário usando .ToDictionary().

\n\n

Importante: ToDictionary cria um Dictionary comum, que novamente não garante ordem. Se a ordem for crítica — use SortedDictionary ou uma lista de tuplas.

\n\n

Método 2: SortedDictionary — quando a ordem é necessária constantemente

\n\n

Se você planeja acessar os dados ordenados várias vezes, é melhor usar SortedDictionary. Esta classe mantém automaticamente a ordenação pela chave. Mas nós precisamos ordenar pelo valor!

\n\n

O truque: não podemos fazer o SortedDictionary ordenar diretamente pelo valor. Mas podemos usar um SortedDictionary com um comparador personalizado ou, mais simplesmente, criar uma classe auxiliar.

\n\n
using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nvar fruits = new Dictionary<string, int>\n{\n    {"apple", 5},\n    {"banana", 3},\n    {"orange", 8},\n    {"grape"                

Blogs

Book Recommendations