2013-06-02 4 views
0

J'ai un dictionnaire qui contient un autre dictionnaire comme valeur quelque chose comme çaComment trier un dictionnaire contenant un dictionnaire?

Dictionary<string, Dictionary<double,double>> 

maintenant je veux faire le tri par la valeur du dictionnaire interne comment puis-je faire ??

+2

Je ne vais pas même imaginer pourquoi vous auriez besoin d'une telle structure de données, mais ce sont quelques-uns des exemples de données que vous détenez et comment essayez-vous de trier les données? Rappelez-vous qu'un dictionnaire lui-même n'est pas triable. – gunr2171

+0

Certaines valeurs de dictionnaires et sur quelle base vous voulez les trier aideraient. –

+0

désolé je ne suis pas expert sur C#, suggérez-vous un moyen de stocker 3 valeurs en tant qu'un seul article? – user1225072

Répondre

4

Des regards de votre commentaire

désolé je ne suis pas expert en C#, proposeriez-vous un moyen de stocker 3 valeurs comme un seul élément?

Je suggère la création d'une classe et trier sur comme ça

public class MyClass 
{ 
    public string StringProperty {get;set;} 
    public int FirstDoubleProperty {get;set;} 
    public int SecondDoubleProperty {get;set;} 
} 

Ensuite, créez une collection comme celui-ci

List<MyClass> MyClasscol = new List<MyClass>(); 

MyClass mc = new MyClass(); 

mc.StringProperty = "User1225072"; 
mc.FirstDoubleProperty = 5; 
mc.SecondDoubleProperty = 6; 

MyClasscol.Add(mc); 

mc = new MyClass(); 

// and So on 

puis trier comme celui-ci

var newsortedcollection = MyClasscol.OrderBy(x => x.FirstDoubleProperty); 
+0

merci beaucoup, cela fonctionne très bien – user1225072

1

En supposant vous essayez maintenant de comprendre comment stocker et ord Comme une collection d'objets avec plusieurs propriétés, vous avez quelques options. Nikhil Agrawal's answer est une excellente solution mais il se peut que vous n'ayez pas besoin de créer une classe personnalisée pour cela. Pour ces situations (de préférence lorsque votre code est privé et ne fait pas partie de certaines API), les alternatives ci-dessous peuvent être une option.

KeyValuePairs

En fonction de vos besoins et votre message original à l'aide de dictionnaires, il semble que la place d'un dictionnaire de dictionnaires (à plusieurs niveaux), vous avez probablement voulu un dictionnaire de keyvaluepairs (plat).

// using keyvaluepair 
var keyValueDict = new Dictionary<string, KeyValuePair<double, double>>(); 
keyValueDict.Add("string", new KeyValuePair<double, double>(5.8, 7.4)); 
var sortedKeyValues = keyValueDict.OrderBy(x => x.Value.Key); 

Tuples

Une alternative au pas si agréable KeyValuePair est le Tuple introduit dans .NET 4. Le tuple est une classe générique qui vous permet de stocker des valeurs de propriété tapées sans créer votre propre coutume classe. Il est à noter qu'il existe des implémentations de tuple pour jusqu'à 8 propriétés.

// using tuple 
var tupleList = new List<Tuple<string, double, double>>(); 
tupleList.Add(new Tuple<string, double, double>("string", 5.8, 7.4)); 
var sortedTuples = tupleList.OrderBy(x => x.Item2); 

Il y a quelques bonnes SO questions sur Tuples si vous êtes intéressé:
Is Using .NET 4.0 Tuples in my C# Code a Poor Design Decision?
Are EventArg classes needed now that we have generics

+0

grande info, merci – user1225072

Questions connexes