2015-03-05 2 views
0

Я работаю с упорядоченным словарем (как это структура данных, которая дает мне функциональность для доступа к элементам с помощью как ключом и индекса.)C# Сортировка упорядоченного словаря

Я пытаюсь сортировать его с помощью пузырьковой сортировки,

(особенно потому, что некоторые унаследованного кода, который будет вызывать этот имеет компаратор определен только один метод, как один элемент меньше другого элемента. ILzObjectComparator_Less (ByVal Первый As Object, _ ByVal Второй As Object) As Boolean) )

Хотя мой код работает, т. Е. Сортирует по значению, он меняет сопоставления значений ключа.

Вот мой метод -.

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; 
       } 
      } 
     } 
    } 

Существует один similar question, но используется OrderBy, который я не могу сопоставить с ILzObjectComparator, который использует наш унаследованный код) Любая помощь будет высоко оценен.

+0

Рассматривали ли вы использование встроенной поддержки .NET для сортировки с использованием собственного [компаратора] (https://msdn.microsoft.com/en-us/library/w56d4y5z (v = vs.110) .aspx)? –

+0

Вы решили проблему? – TaW

ответ

0

Вы ссылаетесь не Elements в Dictionary но их Values: od[i]

Вы можете попробовать использовать вместо Elements: od.ElementAt(i), но это не позволит вам назначить к ней ничего не может вам сделать InsertAt().

Обратите внимание, что я не уверен, что заказ в Dictionary гарантирован.

Итак, я не думаю, что вы можете это сделать.

Но, конечно, есть класс OrderedDictionary.

Но так как вам нужно использовать пользовательский сопоставитель, я думаю, вам нужно переключиться на другой класс коллекции, возможно, List<Tuple<>>?

Вот пример

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

После добавления нескольких элементов можно сортировать его, по любому из пункта:

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); 
     } 
    } 
} 

Конечно Tuple менее полезен, чем Dictionary, единственность пример и т. д.

Смежные вопросы