关于c#:如何保持字典顺序?

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,它将按顺序排在前面。


不要使用OrderedDictionary,应该使用SortedDictionary

这个是按键排序的。所以以你的字符串为例。这就足够了。

更新:

如果不使用任何本机可比类型,则需要为密钥类实现IEqualityComparer接口。


您还可以使用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