Ordenar un diccionario en su lugar con respecto a las claves

Tengo un diccionario en C # como

Dictionary 

y quiero ordenar ese diccionario en su lugar con respecto a las teclas (un campo en la clase Persona). ¿Cómo puedo hacerlo? Toda la ayuda disponible en Internet es la de listas sin ningún ejemplo particular de ordenación in situ de Diccionario. ¡Cualquier ayuda sería muy apreciada!

No puede ordenar un Dictionary – está inherentemente desordenado. (O más bien, el orden en que se recuperan las entradas es específico de la implementación. No debe confiar en que funcione de la misma manera entre versiones, ya que el orden no es parte de su funcionalidad diseñada).

Puede usar SortedList u SortedDictionary , que se clasifican por la clave (de forma configurable, si pasa un IEqualityComparer al constructor) – podrían serle útiles. ?

Preste poca atención a la palabra “lista” en el nombre SortedList : sigue siendo un diccionario porque mapea las claves de los valores. Se implementa utilizando una lista de manera interna y efectiva, por lo que en lugar de buscar por código hash, realiza una búsqueda binaria. SortedDictionary se basa de manera similar en búsquedas binarias, pero a través de un árbol en lugar de una lista.

Intenta usar SortedDictionary

La respuesta correcta ya está indicada (solo use SortedDictionary).

Sin embargo, si por casualidad tiene alguna necesidad de conservar su colección como Diccionario, es posible acceder a las claves del Diccionario de una manera ordenada, por ejemplo, ordenando las claves en una Lista, y luego usando esta lista para acceder al Diccionario. Un ejemplo…

 Dictionary dupcheck = new Dictionary(); 

… algún código que rellene “dupcheck”, entonces …

 if (dupcheck.Count > 0) { Console.WriteLine("\ndupcheck (count: {0})\n----", dupcheck.Count); var keys_sorted = dupcheck.Keys.ToList(); keys_sorted.Sort(); foreach (var k in keys_sorted) { Console.WriteLine("{0} = {1}", k, dupcheck[k]); } } 

No olvides using System.Linq; para esto.

Por diseño, los diccionarios no se pueden ordenar. Si necesita esta capacidad en un diccionario, consulte SortedDictionary en su lugar.

Eche un vistazo a SortedDictionary , incluso hay una sobrecarga de constructor para que pueda pasar su propio IComparable para las comparaciones.

Mientras Dictionary se implementa como una tabla hash, SortedDictionary se implementa como un árbol rojo-negro.

Si no aprovecha el orden en su algoritmo y solo necesita ordenar los datos antes de la salida, usar SortedDictionary tendría un impacto negativo en el rendimiento .

Puede “ordenar” el diccionario de esta manera:

 Dictionary dictionary = new Dictionary(); // algorithm return new SortedDictionary(dictionary); 

Debido a esto, las respuestas a la búsqueda de alta colocación pensé que vale la pena mostrar la solución LINQ OrderBy :

 class Person { public Person(string firstname, string lastname) { FirstName = firstname; LastName = lastname; } public string FirstName { get; set; } public string LastName { get; set; } } static void Main(string[] args) { Dictionary People = new Dictionary(); People.Add(new Person("John", "Doe"), 1); People.Add(new Person("Mary", "Poe"), 2); People.Add(new Person("Richard", "Roe"), 3); People.Add(new Person("Anne", "Roe"), 4); People.Add(new Person("Mark", "Moe"), 5); People.Add(new Person("Larry", "Loe"), 6); People.Add(new Person("Jane", "Doe"), 7); foreach (KeyValuePair person in People.OrderBy(i => i.Key.LastName)) { Debug.WriteLine(person.Key.LastName + ", " + person.Key.FirstName + " - Id: " + person.Value.ToString()); } } 

Salida:

 Doe, John - Id: 1 Doe, Jane - Id: 7 Loe, Larry - Id: 6 Moe, Mark - Id: 5 Poe, Mary - Id: 2 Roe, Richard - Id: 3 Roe, Anne - Id: 4 

En este ejemplo, tendría sentido usar también ThenBy para los primeros nombres:

 foreach (KeyValuePair person in People.OrderBy(i => i.Key.LastName).ThenBy(i => i.Key.FirstName)) 

Entonces la salida es:

 Doe, Jane - Id: 7 Doe, John - Id: 1 Loe, Larry - Id: 6 Moe, Mark - Id: 5 Poe, Mary - Id: 2 Roe, Anne - Id: 4 Roe, Richard - Id: 3 

LINQ también tiene OrderByDescending y ThenByDescending para aquellos que lo necesitan.