2015-03-05 1 views
0

Je travaille avec le dictionnaire commandé (car il est la structure de données qui me donne la fonctionnalité aux éléments d'accès par la clé et l'index.)C# tri ordonné dictionnaire

Je suis en train de faire le tri à l'aide tri à bulles,

(spécialement parce que certains code existant qui appelleront cela a comparateur défini avec une seule méthode, comment un élément est inférieur à l'autre élément. ILzObjectComparator_Less (BYVAL d'abord comme objet, _ ByVal Second As Object) As Boolean) )

Bien que mon code fonctionne, c'est-à-dire qu'il effectue un tri par valeur, il modifie les mappages clé-valeur.

Voici ma méthode -.

public void SortUsingComparer(LzCollections.ILzObjectComparator Comparator) 
    { 
     for (int j = 0; j < od.Count; j++) 
     { 
      for (int i = 0; i < od.Count - 1; i++) 
      { 
       if(Comparator.Less(od[i+1],od[i])) 
       { 
        temp = od[i + 1]; 
        od[i + 1] = od[i]; 
        od[i] = temp; 
       } 
      } 
     } 
    } 

Il y a un similar question, mais celui utilisé OrderBy que je ne suis pas en mesure de carte avec ILzObjectComparator que notre code existant utilise) Toute aide serait très appréciée.

+0

avez-vous envisagé d'utiliser le soutien intégré de .NET pour le tri en utilisant votre propre [comparateur] (https://msdn.microsoft.com/en-us/library/w56d4y5z (v = vs.110) .aspx)? –

+0

Avez-vous résolu votre problème? – TaW

Répondre

0

Vous référencez pas Elements dans le Dictionary mais leur Values: od[i]

Vous pouvez essayer d'utiliser le Elements à la place: od.ElementAt(i) mais cela ne vous permettra pas d'attribuer à quoi que ce soit il ne peut vous faire une InsertAt().

Notez que je ne suis même pas sûr que l'ordre dans un Dictionary est garanti.

Donc, je ne pense pas que vous pouvez le faire.

Mais, bien sûr, il y a la classe OrderedDictionary.

Mais puisque vous devez utiliser un comparateur personnalisé, je suppose que vous devez passer à une autre classe de collection, peut-être List<Tuple<>>?

Voici un exemple

List<Tuple<int, int>> od = new List<Tuple<int,int>>(); 

Après avoir ajouté quelques éléments que vous pouvez trier, par soit l'article:

for (int j = 0; j < od.Count; j++) 
{ 
    for (int i = 0; i < od.Count - 1; i++) 
    { 
     // insert your custom comparer here: 
     if (od.ElementAt(i + 1).Item1 < od.ElementAt(i).Item1) 
     { 
      var temp0 = od.ElementAt(i); 
      var temp1 = od.ElementAt(i + 1); 
      od.RemoveAt(i); 
      od.RemoveAt(i); 
      od.Insert(i, temp1); 
      od.Insert(i+1, temp0); 
     } 
    } 
} 

Bien sûr, un Tuple est moins utile qu'un Dictionary, unique pour etc .. par exemple