C#SortedDictionary产生不寻常的结果

时间:2011-05-31 20:26:13

标签: c# sorteddictionary

我正在使用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是我们的Primary SortedDictionary(这个问题的主题) openTrades是另一个SortedDictionary

由于 詹姆斯

4 个答案:

答案 0 :(得分:8)

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 :(得分:1)

我不确定你认为输出应该是什么,但对我来说它是

String 3
String 4
String 1
String 2

哪个是对的。也许您认为SortedDictionary维持广告订单的印象?快速查看the documentation会告诉您情况并非如此。这些值通过密钥上的Comparer<T>进行排序(假设未提供自定义Comparer。)

答案 2 :(得分:1)

正如所有其他人的第一印象一样,如果字典按键而不是按值排序,则会感到困惑。但阅读你的评论似乎不是问题。

所以我(就像其他人一样)将代码粘贴到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]

因此,您将再次检查确切的密钥属于您获得的每个值,并可能找到另一条线索,为什么您会得到一个您不期望的排序。

答案 3 :(得分:0)

问题在于你的foreach循环。 SortedDictionary类公开值列表,但该列表未排序,因此您只是从未排序的列表中读取。


再次阅读代码,我意识到列表是按排序顺序显示的。我认为发生的事情是你感到困惑,因为你以某种方式预期它会对Value字段进行排序。 SortedDictionary通过Key字段(add语句中的整数)进行排序。