c# - recorrer - Ordenar un diccionario en su lugar con respecto a las claves
ordenar un diccionario en python 3 (7)
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<Person, int> People = new Dictionary<Person, int>();
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, int> 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, int> 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.
Tengo un diccionario en C # como
Dictionary<Person, int>
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!
Eche un vistazo a SortedDictionary
, incluso hay una sobrecarga de constructor para que pueda pasar su propio IComparable para las comparaciones.
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<string, int> dupcheck = new Dictionary<string, int>();
... 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.
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<string, int> dictionary = new Dictionary<string, int>();
// algorithm
return new SortedDictionary<string, int>(dictionary);
No puede ordenar un Dictionary<TKey, TValue>
- 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<TKey, TValue>
u SortedDictionary<TKey, TValue>
, que se clasifican por la clave (de forma configurable, si pasa un IEqualityComparer<T>
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.
Por diseño, los diccionarios no se pueden ordenar. Si necesita esta capacidad en un diccionario, consulte SortedDictionary en su lugar.