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
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语句中的整数)进行排序。