【发布时间】: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