【问题标题】:sort Dictionary by generic value按通用值排序字典
【发布时间】:2013-05-21 19:05:08
【问题描述】:

我尝试按通用值对 Dictionary 对象进行排序。

这是我的代码

Dictionary<string, ReportModel> sortedDic = new Dictionary<string, ReportModel>();
Dictionary<string, ReportModel> rDic = new Dictionary<string, ReportModel>();
var ordered = sortedDic.OrderByDescending(x => x.Value.totalPurchase);
foreach (var item in ordered)
{                           
    rDic.Add(item.Key, item.Value);
}

ordered 变量的顺序与 sortedDic 相同。 这有什么问题? 有什么想法吗?

【问题讨论】:

  • totalPurchase 是什么类型?
  • 你得到什么错误?
  • 如何将项目添加到“sortedDic”?是否恰好是从最高到最低的 totalPurchase?
  • 您通过调用字典“sortedDic”来设置自己的混淆,根据定义,字典应该被视为未排序的集合......例如没有隐式排序顺序。将它们插入 rDic 的顺序无关紧要,它只会部分影响 rDic 的顺序,并且任何此类顺序都是未指定的,不能依赖。

标签: c# dictionary


【解决方案1】:

这是因为Dictionary 通常是一个无序容器*。当你把数据放入rDic时,它又变成了无序的。

要保留所需的顺序,您需要将结果放入一个明确保留您提供的顺序的容器中。例如,您可以使用KeyValuePair&lt;string,ReportModel&gt; 的列表,如下所示:

IList<KeyValuePair<string,ReportModel>> ordered = sortedDic
    .OrderByDescending(x => x.Value.totalPurchase)
    .ToList();


* 由于Dictionary&lt;K,V&gt; 是由Microsoft 实现的,it happens to retain the insertion order,但这是偶然的和未记录的,因此它可能会在未来的版本中发生变化,不应依赖它。

【讨论】:

  • 我测试了上面的代码,它在我的场景中工作。我只是幸运吗?
  • @LuisFilipe 运气不好,这是我在答案的脚注中提到的未记录的实现细节 (click this link for more info of what is going on there)。
  • @user1713153 欢迎您!如果您不再积极寻找改进的解决方案,您可能希望接受表明它对您有效的答案。
【解决方案2】:

将项目添加回字典时,它不会保持它们的顺序。 您可以:

  1. 使用following implementation
  2. 使用下表中的列表。

    IEnumrable> lst=
       sortedDic.OrderByDescending(x => x.Value.totalPurchase).ToArray();
  3. [编辑] 如果您不介意更改密钥,则可以使用 SortedDictionary。

【讨论】:

  • .Net Framework 已经为此类事物提供了“SortedDictionary”数据类型。
  • 是的,我认为他不想改变钥匙,但这是正确的。我会补充的。
猜你喜欢
  • 2019-09-28
  • 2017-02-02
  • 1970-01-01
  • 2015-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-30
  • 2013-02-19
相关资源
最近更新 更多