c# ordenar - ¿Cómo ordenas un diccionario por valor?




9 Answers

Utilizar:

using System.Linq.Enumerable;
...
List<KeyValuePair<string, string>> myList = aDictionary.ToList();

myList.Sort(
    delegate(KeyValuePair<string, string> pair1,
    KeyValuePair<string, string> pair2)
    {
        return pair1.Value.CompareTo(pair2.Value);
    }
);

Ya que está apuntando a .NET 2.0 o superior, puede simplificar esto en la sintaxis lambda: es equivalente, pero más breve. Si está apuntando a .NET 2.0, solo puede usar esta sintaxis si está usando el compilador de Visual Studio 2008 (o superior).

var myList = aDictionary.ToList();

myList.Sort((pair1,pair2) => pair1.Value.CompareTo(pair2.Value));
python como

A menudo tengo que ordenar un diccionario, que consiste en claves y valores, por valor. Por ejemplo, tengo un hash de palabras y frecuencias respectivas, que quiero ordenar por frecuencia.

Hay una lista SortedList que es buena para un solo valor (por ejemplo, frecuencia), que quiero mapear de nuevo a la palabra.

SortedDictionary por orden de clave por clave, no por valor. Algunos recurren a una clase personalizada , pero ¿hay una forma más limpia?




var ordered = dict.OrderBy(x => x.Value);



Puede ordenar un Diccionario por valor y guardarlo de nuevo en sí mismo (de modo que cuando se encuentre sobre él, los valores salgan en orden):

dict = dict.OrderBy(x => x.Value).ToDictionary(x => x.Key, x => x.Value);

Claro, puede que no sea correcto, pero funciona.




De todos modos, nunca podrías ordenar un diccionario. En realidad no están ordenados. Las garantías para un diccionario son que la clave y las colecciones de valores son iterables, y los valores se pueden recuperar por índice o clave, pero aquí no hay garantía de ningún orden en particular. Por lo tanto, necesitarías obtener el par de valores de nombre en una lista.




Dictionary<string, string> dic= new Dictionary<string, string>();
var ordered = dic.OrderBy(x => x.Value);
return ordered.ToDictionary(t => t.Key, t => t.Value);



Ordenar los valores

Esto muestra cómo ordenar los valores en un Diccionario. Vemos un programa de consola que puede compilar en Visual Studio y ejecutar. Agrega claves a un Diccionario y luego las ordena por sus valores. Recuerde que las instancias del Diccionario no están inicialmente ordenadas de ninguna manera. Usamos la palabra clave orderby LINQ en una declaración de consulta.

OrderBy Cláusula programa que ordena Diccionario [C #]

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main()
    {
        // Example dictionary.
        var dictionary = new Dictionary<string, int>(5);
        dictionary.Add("cat", 1);
        dictionary.Add("dog", 0);
        dictionary.Add("mouse", 5);
        dictionary.Add("eel", 3);
        dictionary.Add("programmer", 2);

        // Order by values.
        // ... Use LINQ to specify sorting by value.
        var items = from pair in dictionary
                orderby pair.Value ascending
                select pair;

        // Display results.
        foreach (KeyValuePair<string, int> pair in items)
        {
            Console.WriteLine("{0}: {1}", pair.Key, pair.Value);
        }

        // Reverse sort.
        // ... Can be looped over in the same way as above.
        items = from pair in dictionary
        orderby pair.Value descending
        select pair;
    }
}

Salida

dog: 0
cat: 1
programmer: 2
eel: 3
mouse: 5



La forma más fácil de obtener un diccionario ordenado es usar la clase SortedDictionary :

//Sorts sections according to the key value stored on "sections" unsorted dictionary, which is passed as a constructor argument
System.Collections.Generic.SortedDictionary<int, string> sortedSections = null;
if (sections != null)
{
    sortedSections = new SortedDictionary<int, string>(sections);
}

sortedSections contendrá la versión ordenada de las sections




Supongamos que tenemos un diccionario como

   Dictionary<int, int> dict = new Dictionary<int, int>();
   dict.Add(21,1041);
   dict.Add(213, 1021);
   dict.Add(45, 1081);
   dict.Add(54, 1091);
   dict.Add(3425, 1061);
   sict.Add(768, 1011);

1) puedes usar temporary dictionary to store values as :

        Dictionary<int, int> dctTemp = new Dictionary<int, int>();

        foreach (KeyValuePair<int, int> pair in dict.OrderBy(key => key.Value))
        {
            dctTemp .Add(pair.Key, pair.Value);
        }



Dado que tiene un diccionario, puede clasificarlos directamente en valores utilizando el siguiente forro:

var x = (from c in dict orderby c.Value.Order ascending select c).ToDictionary(c => c.Key, c=>c.Value);



Related