2012-02-14 13 views
5

Supongamos que tenemos unOrdenar un Dictionary <int, Lista <int>> mediante las teclas + valores de lista dentro de

var dictionary= new Dictionary<int, IList<int>>(); 

Lo que yo quiero es ouput una versión clasificada del mismo, pedimos por primera vez por teclas y luego por los valores en el interior una lista.

E.g.

1 2, 1, 6 
5 2, 1 
2 1, 3 

Se convierte en

1 1, 2, 6 
2 1, 3 
5 1, 2 

He intentado hacer que el interior foreach, pero obviamente esto es una mala idea para cambiar lo que está iterando.

+1

"Quiero obtener una versión ordenada" - _how_ lo desea? Como salida, o como una nueva colección? –

+0

editó la pregunta –

Respuesta

10

Prueba esto:

// Creating test data 
    var dictionary = new Dictionary<int, IList<int>> 
    { 
     { 1, new List<int> { 2, 1, 6 } }, 
     { 5, new List<int> { 2, 1 } }, 
     { 2, new List<int> { 2, 3 } } 
    }; 

    // Ordering as requested 
    dictionary = dictionary 
     .OrderBy(d => d.Key) 
     .ToDictionary(
      d => d.Key, 
      d => (IList<int>)d.Value.OrderBy(v => v).ToList() 
     ); 

    // Displaying the results 
    foreach(var kv in dictionary) 
    { 
     Console.Write("\n{0}", kv.Key); 
     foreach (var li in kv.Value) 
     { 
      Console.Write("\t{0}", li); 
     } 
    } 
+0

Esto está mal por dos razones. Primero, volviendo a ponerlos en un diccionario, corrompe de nuevo su orden preferida. Dos, no puede convertir un 'IOrderedEnumerable ' a 'IList '. – nawfal

+0

Nos perdimos la llamada ToList, de hecho. Sin embargo, el orden se mantiene. – Schiavini

+0

bien. Pero aún así, al llamar 'ToDictionary' al final, está volviendo a colocar los artículos en una colección desordenada. La parte de "trabajo" es una coincidencia, no está documentada. La implementación puede cambiar.Lo que hay que recordar es que ** el diccionario es, por definición, una colección desordenada **. [Ver] (http://stackoverflow.com/questions/1453190/does-the-enumerator-of-a-dictionarytkey-tvalue-return-key-value-pairs-in-the) – nawfal

3

A Dictionary no está clasificado. Para ordenar un diccionario, puede usar el OrderedDictionary.

Para ordenar las listas, puede utilizar List<T>.OrderBy()

+0

Eso resolvería solo la parte de ordenar por claves, ¿no? –

+1

-1: No responde la pregunta, vuelve a leer. El OP no desea ordenar el diccionario, solo quiere enviarlo ordenado. – leppie

+0

@leppie lo leí nuevamente. Y aún OP explícitamente dice que quiere una "versión ordenada de ella". Una versión ordenada de un diccionario es, bueno, adivina. Gracias por el downvote de todos modos. –

0

Puede recorrer los elementos del diccionario y ordenar cada lista por separado. se verá así:

SortDictionary (diccionario);

después de eso:

foreach (System.Collections.Generic.KeyValuePair<int,IList<int>> list in dictionary) 
     { 
      SortDictionary(list.Value) 
     } 
3

Usted puede utilizar LINQ para ordenar el contenido del diccionario de la siguiente manera:

 var dictionary = new Dictionary<int, IList<int>>(); 
     var orderedItems = dictionary 
           .OrderBy(pair => pair.Key) 
           .Select(new { 
             Key = pair.Key, 
             Value = pair.Value.OrderBy(i => i)}); 

Por supuesto, esto es bastante feo. Una mejor opción en este momento es usar la sintaxis de LINQ

  var orderedItems =from pair in dictionary 
        orderby pair.Key 
        let values = pair.Value.OrderBy(i => i) 
        select new { Key = pair.Key, Value = values }; 

Si necesita utilizar el IEnumerable resultante como una lista o matriz, puede crear uno con ToList o ToArray. Sin embargo, en la mayoría de los casos, solo puede usar IEnumerable, ya que es

+0

¡FALLA! El orden se perderá al ir al diccionario. – leppie

+0

Vaya, copié esto directamente del código de trabajo. Modificándolo ahora –

+0

Claramente, no funciona: p – leppie

Cuestiones relacionadas