2015-08-13 2 views
0

Мой массив словарь ключевых пар значений аналогичны этимКак изменить индекс в массиве словарей?

[0] 
key : x 
value : 1 
[1] 
key : y 
value : 2 
[2] 
key : z 
value : 3 

Но мне нужно обратить индекс словаря. Мне нужно преобразовать вышеуказанный словарь в это:

[0] 
key : z 
value : 3 
[1] 
key : y 
value : 2 
[2] 
key : x 
value : 1 

Я попробовал функцию Reverse(). Но это не сработало. Я не знаю, как этого добиться. Кто-нибудь может мне с этим помочь ?

Как я могу это достичь?

+4

массив словарей ???как вы его определили, можете ли вы опубликовать некоторый код? – Habib

+1

Возможный дубликат [Сортировка списка в C# (с различными параметрами)] (http://stackoverflow.com/questions/4971601/sorting-a-list-in-c-sharp-with-various-parameters) – Sayse

+0

Показать, что вы попробовали. – Sayse

ответ

5

Вы не должны предполагать, что словари упорядочены. Это не так.

Если вы хотите заказать массив, вы должны использовать SortedDictionary. Вы также можете изменить порядок там, если хотите. Вы должны использовать собственный компаратор для этого (измененного от here):

class DescendedStringComparer : IComparer<string> 
{ 
    public int Compare(string x, string y) 
    { 
     int ascendingResult = Comparer<string>.Default.Compare(x, y); 

     // turn the result around 
     return 0 - ascendingResult; 
    } 
} 

// 

SortedDictionary<string, string> test 
    = new SortedDictionary<string, string>(new DescendedDateComparer()); 

Вы можете итерацию над ним с foreach, например. Результаты будут упорядочены по убыванию.

2

Функция Enumerable.Reverse() возвращает IEnumerable, а не массив. Вы забыли сделать обратную последовательность массива? Следующие работал для меня:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var dict = new Dictionary<string, int>(); 
     dict.Add("x", 1); 
     dict.Add("y", 2); 
     dict.Add("z", 3); 
     var reversed = dict.ToArray().Reverse(); 
     var reversedArray = reversed.ToArray(); 
     Console.ReadKey(); 
    } 
} 
+0

Я тоже хочу использовать заказ. – SilentTremor

+0

Он использует 'Словарь []' –

+0

Тим: массив словарей? И каждый словарь содержит один элемент? Может быть, но даже тогда Reverse все еще работает. –

0

Вы должны использовать SortedDictionary и передать ключ по строительству

public sealed class CompareReverse<T> : IComparer<T> 
{ 
    private readonly IComparer<T> original; 

    public CompareReverse(IComparer<T> original) 
    { 

     this.original = original; 
    } 

    public int Compare(T left, T right) 
    { 
     return original.Compare(right, left); 
    } 
} 

и в основной вызов

var mydictionary = new SortedDictionary<int, string>(
    new CompareReverse<int>(Comparer<int>.Default)); 

для например: -

var mydictionary = new SortedDictionary<int, string>(
    new CompareReverse<int>(Comparer<int>.Default)); 
    dictionary.add(1, "1"); 
    dictionary.add(2, "2"); 
    dictionary.add(3, "3"); 
    dictionary.add(4, "4"); 
1

Я пробовал reverse метод, он сработал. См. Ниже изображения. Я использовал VS 2013, .Net 4,5

enter image description here

Выход генерируется

enter image description here

+0

Вы не можете доверять порядку «Словаря», когда коллекция неупорядочена. Он хранит порядок в этом примере игрушек, но как только вы начинаете удалять и перезаписывать предметы, вы теряете заказ. –

0

SortedDictionary сортирует по ключу, а не по значению.

Вот чистый способ, чтобы изменить порядок значений в словаре:

List<KeyValuePair<string, string>> srcList = aDictionary.ToList(); 

srcList.Sort(
    delegate(KeyValuePair<string, string> firstPair, 
    KeyValuePair<string, string> nextPair) 
    { 
     return firstPair.Value.CompareTo(nextPair.Value); 
    } 
); 

Dictionary<string, string> outputDictionary = new Dictionary<string, string>(); 
int listCount = srcList.Count; 
for(int i = 0; i < listCount; i++) { 
    int valueIndex = i + 1; 
    outputDictionary.Add(srcList[i].Key, srcList[valueIndex]); 
} 

Если то, что вы хотите в качестве вывода является Список KeyValuePairs, а не в словарь, вы можете заменить заключительные 6 строк кода в моем примере с этим:

List<KeyValuePair<string, string>> destList = new List<KeyValuePair<string, string>>(); 
int listCount = srcList.Count; 
for(int i = 0; i < listCount; i++) { 
    int valueIndex = i + 1; 
    destList.Add(new KeyValuePair<string, string>(srcList[i].Key, srcList[valueIndex])); 
} 
Смежные вопросы