【问题标题】:C# SortedDictionary producing unusual resultsC# SortedDictionary 产生异常结果
【发布时间】:2011-05-31 20:26:13
【问题描述】:

我正在使用一个 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

谢谢 詹姆斯

【问题讨论】:

  • 如果“随机”表示您获得了String3, String4, String1, String2,那么您将获得预期的行为。
  • 你有没有弄清楚这里的问题是什么?如果是这样,很高兴知道!

标签: c# sorteddictionary


【解决方案1】:

SortedDictionary而不是值排序。

如果您执行以下操作

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

你会看到它按key排序的顺序打印出来:

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

【讨论】:

  • 嗨,这就是我的意思 - 它不是那样出来的,它是像 1113,70,1,100 这样的随机键顺序出现的,绝对没有一致性。
  • @James:你能显示最终字典的实际循环代码吗,那么必须关闭其他东西。
  • 我已将其添加到问题的末尾,谢谢您的帮助
【解决方案2】:

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

String 3
String 4
String 1
String 2

这是正确的。也许您的印象是SortedDictionary 维护插入顺序?对the documentation 的快速回顾会告诉您情况并非如此。这些值通过键上的Comparer&lt;T&gt; 排序(假设没有提供自定义比较器。)

【讨论】:

  • 嗨,这就是我的意思 - 它不是那样出来的,它是以随机键顺序出现的,比如 1113,70,1,100 绝对没有一致性
【解决方案3】:

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

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

String 3
String 4
String 1
String 2

如果您的机器上的顺序不同,那么那里似乎发生了一些非常奇怪的事情。也许您可以再运行一次,但对您的 foreach 语句稍作改动:

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

现在在 item 中你会得到一个KeyValuePair&lt;int, string&gt;,它会像这样很好地打印出来:

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

因此,您将再次检查您获得的每个值属于哪个确切键,并且可能会找到另一个线索,为什么您会得到意想不到的排序。

【讨论】:

  • 嗨,我已经添加了更多信息,请看一下我认为我过度简化了解释
【解决方案4】:

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


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

【讨论】:

  • 嗨,这就是我的意思 - 它不是那样出来的,它是以随机键顺序出现的,比如 1113,70,1,100 绝对没有一致性
猜你喜欢
  • 2017-12-19
  • 2023-03-25
  • 1970-01-01
  • 2020-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-10
  • 1970-01-01
相关资源
最近更新 更多