如何保持字典顺序?

时间:2015-06-18 05:19:41

标签: c# dictionary

我有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,它将在顺序之前添加。

2 个答案:

答案 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