我有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
没有帮助,因为它强制值为object
s;我想让他们成为职能代表。与此同时,我不想添加太多不必要的复杂性(例如,我可以将密钥的副本存储为List<string>
以用于订单,但这似乎是一个糟糕的解决方案。) / p>
我该怎么办?
注意: 看起来有些人认为我希望我的商品按字母顺序排列。我不。我希望它们保持与我添加它们的顺序相同。也就是说,如果在Function #2
之前添加了密钥Function #1
,它将在顺序之前添加。
答案 0 :(得分:5)
您应该使用SortedDictionary<TKey, TValue>
,而不是使用OrderedDictionary
。
这个按键排序。所以你的字符串为你的例子。这应该足够了。
如果您没有使用任何本机可比类型,则需要为您的密钥类实现IEqualityComparer<T>
接口。
答案 1 :(得分:0)
你也可以使用lambda表达式按键或按这样的值对字典进行排序。
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