【问题标题】:How to keep a Dictionary ordered?如何保持字典有序?
【发布时间】:2015-09-03 14:23:30
【问题描述】:

我有一个Dictionary<string, Func<string, string>>。我使用键来提供下拉菜单项,允许用户选择要运行的算法。然后我可以很方便的将选中的值反馈到字典中,得到相关的函数。

// Initialization
my_dict["Function #1"] = func1;
my_dict["Function #2"] = func2;

...

// Executing
result = my_dict[user_choice](input);

现在,当填充下拉列表(System.Windows.Forms.ComboBox)时,我会使用foreach 循环遍历它的键。 MSDN 警告System.Collections.Generic.Dictionary 不能保证有稳定的订单。但在实践中,我知道订单非常稳定,所以它现在有效。我确实希望为用户很好地订购这些功能。

但是,我想正确地执行此操作 - 即。通过使用保证订单稳定性的数据结构。不幸的是OrderedDictionary 没有帮助,因为它强制将值设置为objects;我想保留他们的功能代表。同时,我不想增加太多不必要的复杂性(例如,我可以将密钥的副本存储为 List<string> 以用于订购,但这似乎是一个糟糕的解决方案)。

我能做什么?

注意:似乎有些人认为我希望我的项目按字母顺序排列。我不。我希望它们保持与添加它们相同的顺序。也就是说,如果在 Function #1 之前添加键 Function #2,它将按顺序排在它之前。

【问题讨论】:

  • 您能否解释一下为什么基本排序的List<KVP<string, Func<string,string>>> 不起作用? (假设您的“下拉菜单”支持选定的值/索引以及选定的文本)...
  • 如果您打算使用 SortedDictionary,那么直到您的密钥是字符串为止,否则您需要 TKey 的 IEqualityComparer,请查看此链接 - stackoverflow.com/questions/2705607/…
  • 也许你需要自己实现IDictionary
  • @AlexeiLevenkov 您应该将您的解决方案作为答案发布,因为其他两个答案不是这个问题的答案。
  • 使用非泛型 OrderedDictionary 或像在这个旧问题中那样自己实现它:stackoverflow.com/questions/2629027/…

标签: c# dictionary


【解决方案1】:

您应该使用SortedDictionary<TKey, TValue>,而不是使用OrderedDictionary

这个是按key排序的。因此,以您的字符串为例。这应该足够了。

更新:

如果您不使用任何本机可比较类型,则需要为您的键类实现 IEqualityComparer<T> 接口。

【讨论】:

  • 对于 TKey,你可能仍然需要 IEqualityComparer,假设 key 不是字符串
  • @MrinalKamboj:是的,但问题出在哪里?我认为他能够实施一个适当的。
  • @MrinalKamboj:这绝对不是我回答的问题。我不是完整编程语言的老师。他应该能够为自己做一些工作。
  • 但我不希望它们按字母顺序排列。我已经有自己的订单了。
  • 然后按照您喜欢的顺序实现比较器。
【解决方案2】:

你也可以像这样使用 lambda 表达式按 Key 或 Value 对字典进行排序。

 Dictionary<int, string> myDic = new Dictionary<int, string>();
                myDic.Add(1, "a");
                myDic.Add(2, "b");
                myDic.Add(3, "c");
                myDic.Add(4, "d");
                myDic.Add(5, "e");
                myDic.OrderBy(cond => cond.Key); //sort by key
                myDic.OrderBy(cond => cond.Value); //sort by value

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2021-06-23
  • 2020-11-01
  • 1970-01-01
  • 2018-02-11
  • 1970-01-01
  • 2019-06-24
  • 1970-01-01
  • 2015-08-05
相关资源
最近更新 更多