web-dev-qa-db-fra.com

Comment trier un dictionnaire par clé

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 

26
AMH

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

27
Erno de Weerd

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é.

9
sandman0615

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.

5
Beth Whitezel

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
2
Jorney Huang

J'ai utilisé 

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

et je l'ai converti en dictionnaire 

0
AMH