How to keep a Dictionary ordered?
我有一台Dictionary>。我使用键提供下拉列表中的项目,允许用户选择要运行的算法。然后我可以方便地将所选的值反馈到字典中,以获得相关的函数。
1 2 3 4 5 6 7 8
| // 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,但这似乎是一个糟糕的解决方案)。
我能做什么?
注意:看起来有些人认为我希望我的物品按字母顺序排列。我不想。我希望他们保持我加入他们的顺序。也就是说,如果在Function #1之前添加键Function #2,它将按顺序排在前面。
- 你能解释一下为什么基本分类的List>>不起作用吗?(假设您的"下拉列表"支持所选值/索引以及所选文本)…
- 如果您计划使用SortedDictionary,那么直到您的密钥字符串正确为止,否则您需要一个用于tkey的IEqualityComparer,请检查此链接-stackoverflow.com/questions/2705607/…
- 也许您需要自己实现IDictionary。
- @Alexeilevenkov你应该把你的答案作为答案,因为其他两个答案不是这个问题的答案。
不要使用OrderedDictionary,应该使用SortedDictionary。
这个是按键排序的。所以以你的字符串为例。这就足够了。
更新:
如果不使用任何本机可比类型,则需要为密钥类实现IEqualityComparer接口。
- 谢谢编辑!
- 对于t key,您可能仍然需要iequalityComparer,假设key不是string
- @是的,问题出在哪里?我认为他能实施一个适当的计划。
- 问题是,您需要将其定义为解决方案的一部分,否则它是不完整的,并且只会因为OP使用的是字符串键而起作用。
- @林纳卡姆博:这显然不是我回答的问题。我不是完整编程语言的老师。他应该能为自己做些工作。
- 好吧,如果你不愿意学习或接受,我做不了什么。答案应该尽可能完整。
- 哈哈哈…做任何能让你快乐的事。所以我也应该解释如何初始化和如何将内容添加到字典中…来吧。现在太幼稚了。
- Sooo…你对这个答案更满意吗?
- 当然可以,直到你对额外的细节感到满意为止。
- 但我不想按字母顺序排列。我已经有自己的订单了。
- 然后用您喜欢的顺序实现比较器。
您还可以使用lambda表达式按键或这样的值对字典进行排序。
1 2 3 4 5 6 7 8
| 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 |
- 这将失败,不正确,请检查此链接-stackoverflow.com/questions/8110324/&hellip;