J'ai le dictionnaire Dictionary<string, Point>
la clé est c1, c3, c2, t1, t4, t2 Je veux les trier pour être c1, c2, c3, t1, t2, t3
J'essaye de le trier avec
Input.OrderBy(key => key.Key );
mais ça ne marche pas
aucune idée de comment résoudre ce problème
Input.OrderBy
ne trie pas le dictionnaire, il crée une requête qui renvoie les éléments dans un ordre ordonné.
Peut-être OrderedDictionary vous donne-t-il ce que vous voulez.
Ou utilisez le Générique SortedDictionary
Chargez l'objet non trié dans un objet SortedDictionary comme ceci:
SortedDictionary<string, string> sortedCustomerData = new SortedDictionary<string,string>(unsortedCustomerData);
Où unsortedCustomerData correspond au même type générique (chaîne de dictionnaire, chaîne ou, dans votre chaîne de cas, point). Il va automatiquement trier le nouvel objet par clé
Selon msdn: SortedDictionary (IDictionary): initialise une nouvelle instance de la classe SortedDictionary contenant les éléments copiés à partir de l'IDictionary spécifié et utilise l'implémentation IComparer par défaut pour le type de clé.
Juste une supposition, mais il semble que vous supposiez que cela va trier Input. La méthode OrderBy renvoie en réalité une instance ordonnée d'un IOrderedEnumerable contenant les mêmes valeurs. Si vous souhaitez conserver la valeur de retour, vous pouvez procéder comme suit:
IOrderedEnumerable orderedInput
orderedInput = Input.OrderBy(key=>key.Key)
La plupart des méthodes qui modifieraient la collection suivent ce même modèle. Pour ce faire, il ne modifie pas l'instance de collecte d'origine. Cela vous évite de modifier accidentellement l'instance lorsque vous n'aviez pas l'intention de le faire. Si vous souhaitez uniquement utiliser l'instance triée, vous devez simplement définir la variable sur le retour de la méthode, comme indiqué ci-dessus.
Le code suivant utilise deux autres list s to sort a dictionary.
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);
}
}
}
Le résultat du code ci-dessus est présenté ci-dessous.
c1 1 2
c2 4 5
c3 0 1
c4 3 4
t1 5 6
t2 6 7
t3 2 3
J'ai utilisé
var l = Input.OrderBy(key => key.Key);
et je l'ai converti en dictionnaire