C#排序字典产生异常结果

本文关键字:异常 结果 排序 字典 | 更新日期: 2023-09-27 17:58:01

我正在使用一个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,1100 一样出现


看起来我可能过于简化了这个问题,但这应该没有什么区别,涉及到很多嵌套,最终的字典实际上是另一个字典的子字典,它是另一字典的子!

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是我们的主排序词典(这个问题的主题)openTrades是另一个SortedDictionary

谢谢James

C#排序字典产生异常结果

SortedDictionary根据键而不是值进行排序。

如果您执行以下

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

你会看到它按键按排序顺序打印出来

1-String 3
70-String 4
100-String 1
1113-String 2

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

String 3
String 4
String 1
String 2

这是正确的。也许您认为SortedDictionary保持插入顺序?快速查看文档会发现事实并非如此。通过键上的Comparer<T>对值进行排序(假设没有提供自定义比较器)

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

所以我(和其他人一样)简单地将代码粘贴到Visual Studio中并让它运行。输出为(如预期):

String 3
String 4
String 1
String 2

如果你的机器上的订单不同,那么那里似乎发生了一些非常奇怪的事情。也许你可以再跑一次,但对你的前臂声明做一点改变:

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

现在在项目中,您将得到一个KeyValuePair<int, string>,它将很好地打印出来,如下所示:

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

因此,您将再次检查您得到的每个值的确切关键字,并可能找到另一条线索,说明您为什么会得到意想不到的排序。

问题在于foreach循环。SortedDictionary类公开了值的列表,但该列表没有排序,所以您只是从未排序的列表中读取


再次阅读代码,我意识到列表是按排序顺序显示的。我认为发生的事情是,您感到困惑,因为您不知何故期望它对Value字段进行排序。SortedDictionary对Key字段(add语句中的整数)进行排序。