2011-11-13 10 views
22

Tengo diccionario Dictionary<string, Point>Cómo ordenar un diccionario con llave

la clave es C1, C3, C2, T1, T4, T2 deseo aclarar que sean c1, c2, c3, t1, t2, t3

estoy tratando de solucionar el problema utilizando

Input.OrderBy(key => key.Key); 

pero no trabajar

alguna idea de cómo resolver ese

+1

¿No especie en absoluto, o simplemente no en el orden que se esperaba? –

+0

que no ordena – AMH

+1

http://stackoverflow.com/questions/289/how-do-you-sort-a-c-sharp-dictionary-by-value referencia a esto, tiene algunos muy buenos ejemplos. –

Respuesta

-5

cheque bien esto debería funcionar

var r = new Dictionary<string, Point>(); 
r.Add("c3", new Point(0, 0)); 
r.Add("c1", new Point(0, 0)); 
r.Add("t3", new Point(0, 0)); 
r.Add("c4", new Point(0, 0)); 
r.Add("c2", new Point(0, 0)); 
r.Add("t1", new Point(0, 0)); 
r.Add("t2", new Point(0, 0)); 
var l = r.OrderBy(key => key.Key); 
var dic = l.ToDictionary((keyItem) => keyItem.Key, (valueItem) => valueItem.Value); 

foreach (var item in dic) 
{ 

    Console.WriteLine(item.Key); 
} 
Console.ReadLine(); 
+1

-1: Esto no funcionará. Acabas de crear otro diccionario sin ordenar. Puede funcionar para diccionarios pequeños pero fallará eventualmente. – leppie

+0

nos spoked en el chat y sé lo que quiere, así que lo ayudé a resolver su problema – DeveloperX

+10

@DeveloperX - Mi suposición es que la gente está bajando la votación porque no responde la pregunta. No vemos el chat, por lo que las personas probablemente no lo consideren una respuesta útil a la pregunta que vemos. –

5

Solo una suposición, pero parece que está asumiendo que va a ordenar Entrada. El método OrderBy realmente devuelve una instancia ordenada de un IOrderedEnumerable que contiene los mismos valores. Si desea mantener el valor de retorno que puede hacer el siguiente:

IOrderedEnumerable orderedInput 
orderedInput = Input.OrderBy(key=>key.Key) 

mayoría de los métodos que modificarían la colección siguen el mismo patrón. Hace esto para que no cambie la instancia de colección original. Esto lo protege de cambiar accidentalmente la instancia cuando no tenía la intención de hacerlo. Si solo desea utilizar la instancia ordenada, simplemente configure la variable como el resultado del método anterior.

25

Input.OrderBy no ordena el diccionario, crea una consulta que devuelve los elementos en un orden ordenado.

Tal vez OrderedDictionary te da lo que quieres.

O utilizar el genérico SortedDictionary

+0

pero no es genérico y su rendimiento será un problema – AMH

+2

@AMH No haga suposiciones sobre el rendimiento hasta que lo haya probado de manera realista (micro -benchmarks no cuentan). – Richard

+2

¿Cómo sabes que el rendimiento será un problema? –

0

Solía ​​

var l = Input.OrderBy(key => key.Key); 

y me convertí al diccionario

+1

A Dije: ¡esto NO ordena el diccionario! Crea una 'vista' ordenada. –

4

cargar el objeto no clasificados en un objeto SortedDictionary como ese:

SortedDictionary<string, string> sortedCustomerData = new SortedDictionary<string,string>(unsortedCustomerData); 

Donde unsortedCustomerData es el mismo tipo genérico (cadena de diccionario, cadena o en su cadena de caso, punto). Automáticamente ordenará el nuevo objeto por clave

Según msdn: SortedDictionary (IDictionary): Inicializa una nueva instancia de la clase SortedDictionary que contiene elementos copiados del IDictionary especificado y utiliza la implementación predeterminada de IComparer para el tipo de clave.

2

El siguiente código utiliza dos más list s para sort un diccionario.

using System; 
using System.Collections.Generic; 
using System.Drawing; 

namespace ConsoleApplication1 { 
    class Program { 
     static void Main(string[] args) { 
      Dictionary<string,Point> r=new Dictionary<string,Point>(); 
      r.Add("c3",new Point(0,1)); 
      r.Add("c1",new Point(1,2)); 
      r.Add("t3",new Point(2,3)); 
      r.Add("c4",new Point(3,4)); 
      r.Add("c2",new Point(4,5)); 
      r.Add("t1",new Point(5,6)); 
      r.Add("t2",new Point(6,7)); 
      // Create a list of keys 
      List<string> zlk=new List<string>(r.Keys); 
      // and then sort it. 
      zlk.Sort(); 
      List<Point> zlv=new List<Point>(); 
      // Readd with the order. 
      foreach(var item in zlk) { 
       zlv.Add(r[item]); 
      } 
      r.Clear(); 
      for(int i=0;i<zlk.Count;i++) { 
       r[zlk[i]]=zlv[i]; 
      } 
      // test output 
      foreach(var item in r.Keys) { 
       Console.WriteLine(item+" "+r[item].X+" "+r[item].Y); 
      } 
      Console.ReadKey(true); 
     } 
    } 
} 

La salida del código anterior se muestra a continuación.

c1 1 2 
c2 4 5 
c3 0 1 
c4 3 4 
t1 5 6 
t2 6 7 
t3 2 3 
2

Desde Input.OrderBy crea una consulta que devuelve los artículos en un orden ordenado, simplemente asignar al mismo diccionario.

objectDict = objectDict.OrderBy(obj => obj.Key).ToDictionary(obj => obj.Key, obj => obj.Value);

Cuestiones relacionadas