.net - recorrer - ordenar una lista en python sin sort
Cómo ordenar un diccionario por clave (6)
Cargue el objeto sin clasificar en un objeto SortedDictionary de la siguiente manera:
SortedDictionary<string, string> sortedCustomerData = new SortedDictionary<string,string>(unsortedCustomerData);
Donde unsortedCustomerData es del mismo tipo genérico (cadena de diccionario, cadena o en su cadena de caso, punto). Clasificará automáticamente el nuevo objeto por clave
De acuerdo con msdn: SortedDictionary (IDictionary): Inicializa una nueva instancia de la clase SortedDictionary que contiene elementos copiados de IDictionary especificado y utiliza la implementación predeterminada de IComparer para el tipo de clave.
Tengo diccionario Dictionary<string, Point>
la clave es c1, c3, c2, t1,, t4, t2 Quiero ordenarlos para que sean c1, c2, c3, t1, t2, t3
Estoy tratando de ordenarlo usando
Input.OrderBy(key => key.Key );
pero no funciona
alguna idea de cómo resolver eso
El siguiente código usa dos listas más para ordenar 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);
}
}
}
El resultado 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
Es solo una suposición, pero parece que estás asumiendo que va a ordenar Input. El método OrderBy realmente devuelve una instancia ordenada de un IOrderedEnumerable que contiene los mismos valores. Si desea mantener el valor de retorno, puede hacer lo siguiente:
IOrderedEnumerable orderedInput
orderedInput = Input.OrderBy(key=>key.Key)
La mayoría de los métodos que modificarían la colección siguen este 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.
Ok, mira 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();
solía
var l = Input.OrderBy(key => key.Key);
y lo convertí al Diccionario
Input.OrderBy
no ordena el diccionario, sino que crea una consulta que devuelve los elementos en un orden ordenado.
Tal vez OrderedDictionary te da lo que quieres.
O usa el genérico SortedDictionary