C # SortedDictionary, выдающий необычные результаты - PullRequest
2 голосов
/ 01 июня 2011

Я работаю с SortedDictionary, где ключ является целым числом, а значение является строкой.

SortedDictionary<int,string> dic = new SortedDictionary<int,string>();

Теперь скажите, что я добавляю значения типа

dic.Add(100,"String 1");
dic.Add(1113,"String 2");
dic.Add(1,"String 3");
dic.Add(70,"String 4");

, а затем выполните цикл foreach, как

foreach(string item in dic.Values) {
        Console.WriteLine(item);
}

тогда значения никогда не выходят в правильном порядке, они выходят в почти случайном порядке, который похож на поведение обычного словаря. У кого-нибудь есть идеи, почему? я пропускаю / делаю что-то не так?

PS: Когда я говорю, что это происходит в случайном порядке, я имею в виду ключевой порядок, а не значение, поэтому оно получается как 1113,70,1,100


Кажется, я, возможно, слишком упростил задачу, но это не должно иметь никакого значения, здесь много вложений, и последний словарь фактически является потомком другого словаря, который является потомком другого!

SortedDictionary<String, SortedDictionary<String, SortedDictionary<int, SortedDictionary<String, String>>>>()

Словарь, который я перебираю, - это

SortedDictionary<int, SortedDictionary<String, String>>

Вот цикл по запросу:

foreach (SortedDictionary<String, String> cDic in openTrades.Values)
{
    String cTimestamp = convertTimestamp(cDic["open"]);
    if (!closeTrades.ContainsKey(cDic["key"]) && barArray.ContainsKey(cDic["pair"]))
    {
          foreach (SortedDictionary<String, String> bDic in barArray[cDic["pair"]][cDic["frame"]].Values)
          {
               //This is the relative Loop
          }
    }
}

barArray - наш основной SortedDictionary (предмет этого вопроса) openTrades - это еще один SortedDictionary

Спасибо Джеймс

Ответы [ 4 ]

8 голосов
/ 01 июня 2011

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

Если вы выполните следующее

foreach(var item in dic)
{
        Console.WriteLine(item.Key + "-" + item.Value);
}

Вы увидите, что он печатается в отсортированном порядке по ключу:

1-String 3
70-String 4
100-String 1
1113-String 2
1 голос
/ 01 июня 2011

Как и все остальные, мое первое впечатление было то, что вы запутались, если словарь отсортирован по ключам, а не по значениям. Но, читая ваши комментарии, это не кажется проблемой.

Так что я просто (как и другие тоже) вставил код в Visual Studio и позволил ему работать. Выход был (как и ожидалось):

String 3
String 4
String 1
String 2

Если порядок на вашей машине отличается, то там, по-видимому, происходит что-то действительно странное. Может быть, вы можете сделать еще один прогон, но сделайте небольшое изменение в своем выражении foreach:

foreach (var item in dic)
{
    Console.WriteLine(item);
}

Теперь в предмете вы получите KeyValuePair<int, string>, который будет красиво распечатан так:

[1, String 3]
[70, String 4]
[100, String 1]
[1113, String 2]

Таким образом, вы получите еще одну проверку того, какой именно ключ принадлежит каждому полученному значению, и, возможно, найдете другую подсказку, почему вы получаете сортировку, которую вы не ожидаете.

1 голос
/ 01 июня 2011

Я не уверен, что вы думаете, выход должен быть, но для меня это

String 3
String 4
String 1
String 2

Это правильно.Возможно, у вас сложилось впечатление, что SortedDictionary поддерживает порядок вставки?Краткий обзор документации скажет вам, что это не так.Значения сортируются с помощью Comparer<T> на ключе (при условии, что пользовательский Comparer не предоставляется).

0 голосов
/ 01 июня 2011

Проблема заключается в вашем цикле foreach. Класс SortedDictionary предоставляет список значений, но этот список не отсортирован, поэтому вы просто читаете из несортированного списка.


Читая код еще раз, я понял, что список представлен в отсортированном порядке. Я думаю, что это произошло из-за того, что вы запутались, потому что вы как-то ожидали, что он отсортирует поле «Значение». SortedDictionary сортирует по полю Key (целые числа в вашем операторе add).

...