2010-01-17 14 views
6

editar: Gracias Jason, el hecho de que fuera un diccionario no es tan importante. Solo quería que el tiempo de ejecución tuviera poco tiempo de ejecución. ¿Es ese método LINQ rápido? Además, sé que esto está fuera de tema, pero ¿qué significa n => n?¿Cómo puedo pedir un diccionario en C#?

Tengo una lista de números y quiero hacer otra lista con los números que aparecen más al principio y al final.

Lo que hice fue cuando a través de la lista y verifiqué si el número x estaba en el diccionario. Si no fuera así, hice la clave x y el valor uno. Si fue entonces, cambié el valor para que sea el valor más uno.

Ahora quiero ordenar el diccionario para poder hacer una lista con los que aparecen al principio y al final al final.

¿Cómo puedo hacer eso en C#? p. el tiempo de ejecución es muy importante.

Respuesta

11

por lo que suena como que tiene un Dictionary<int, int> donde la clave representa un entero que tiene en una lista y el valor correspondiente representa la cuenta del número de veces que se número entero apareció. Usted está diciendo que desea ordenar las claves por conteos ordenados en orden descendente por frecuencia. Entonces se puede decir

// dict is Dictionary<int, int> 
var ordered = dict.Keys.OrderByDescending(k => dict[k]).ToList(); 

Ahora, parece que usted comenzó con un List<int> cuáles son los valores que desea contar y el orden según el recuento. Esto se puede hacer muy rápidamente en LINQ, así:

// list is IEnumerable<int> (e.g., List<int>) 
var ordered = list.GroupBy(n => n) 
        .OrderByDescending(g => g.Count()) 
        .Select(g => g.Key) 
        .ToList(); 

O en la sintaxis de la consulta

var ordered = (from n in list 
       group n by n into g 
       orderby g.Count() descending 
       select g.Key).ToList(); 

Ahora, si es necesario tener el diccionario intermedia se puede decir

var dict = list.GroupBy(n => n) 
       .ToDictionary(g => g.Key, g => g.Count()); 
var ordered = dict.Keys.OrderByDescending(k => dict[k]).ToList(); 
+1

Este último no es lo mismo. Crea una lista de objetos anónimos en lugar de un diccionario. Puede ser suficiente para el propósito, pero si el Diccionario es necesario en lugar de simplemente conveniente, usaría ToDictionary en su lugar. – tvanfosson

+0

gracias, eso fue muy útil. – Daniel

+0

Lo ejecuté y obtuve la excepción System.StackOverflowException ¿qué está mal? – Daniel

0
List<KeyValuePair<type, type>> listEquivalent = 
new List<KeyValuePair<type, type>>(dictionary);  

    listEquivalent.Sort((first,second) => 
      { 
       return first.Value.CompareTo(second.Value); 
      }); 

¿Algo así como eso?

edición: Jason Gracias por el aviso en mi omisión

+0

No existe el método 'Ordenar' en' Diccionario'. – jason

+0

Grrrr ... Me perdí la parte en la que instanciamos una lista por el objeto del diccionario. Lo siento mucho. Sin embargo, ¡LINQ parecía mejor desde arriba! ¡Gracias Jason por la nota! Lista > myList = new Lista > (diccionario); –

1

Uso la extensión GroupBy en IEnumerable() para agrupar los números y extraer el recuento de cada uno. Esto crea el diccionario de la lista y lo ordena en una declaración.

var ordered = list.GroupBy(l => l) 
        .OrderByDescending(g => g.Count()) 
        .ToDictionary(g => g.Key, g.Count()); 
0

También puede considerar el uso de SortedDictionary.

Ordena los elementos según la clave, durante la inserción. more..

+0

Quiere que las claves del diccionario se clasifiquen en sus valores correspondientes, lo cual es bastante diferente de lo que un 'SortedDictionary' proporcionaría. – jason

4

La siguiente información se proporciona tal como se presenta en: http://www.dotnetperls.com/sort-dictionary

diccionario tiene ningún método Sort. Si tenemos que recorrer los contenidos del diccionario en orden ordenado, debemos adquirir por separado los elementos y ordenarlos. Esto se hace con las propiedades Keys and Values ​​ y una instancia de List.

claves de ordenación

Este ejemplo resuelve el problema mediante el uso de las teclas de propiedad en el ejemplo Diccionario y, a continuación el método de extensión ToList y el método de instancia Ordenar .

En primer lugar, se crea un diccionario de ejemplo y se completa con el método Agregar ; luego, los métodos ToList y Sort se usan en las claves; finalmente, la lista resultante se buclea mediante el uso de la construcción de foreach-loop . Además, tenga en cuenta que la palabra clave tipeada implícita var es utilizada en todo, para reducir la redundancia sintáctica.

programa que ordena claves en el diccionario [C#]

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

class Program 
{ 
    static void Main() 
    { 
    // Create dictionary and add five keys and values. 
    var dictionary = new Dictionary<string, int>(); 
    dictionary.Add("car", 2); 
    dictionary.Add("apple", 1); 
    dictionary.Add("zebra", 0); 
    dictionary.Add("mouse", 5); 
    dictionary.Add("year", 3); 

    // Acquire keys and sort them. 
    var list = dictionary.Keys.ToList(); 
    list.Sort(); 

    // Loop through keys. 
    foreach (var key in list) 
    { 
     Console.WriteLine("{0}: {1}", key, dictionary[key]); 
    } 
    } 
} 

salida

apple: 1 
car: 2 
mouse: 5 
year: 3 
zebra: 0 

ordenar los valores

A continuación mostramos cómo ordenar los valores de 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. Utilizamos la palabra clave orderby LINQ en una declaración de consulta.

Programa Cláusula OrdenarPor 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 

descendente palabra clave

descendente especie

var items = from pair in dictionary 
     orderby pair.Value descending 
     select pair; 

Ejemplo de salida

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

¡Completo! ¡Me gusta! – Armstrongest

Cuestiones relacionadas