在C#中创build一个常量字典

什么是最有效的方法来创build一个常量 (永远不会在运行时更改) string映射到int s?

我试过使用一个常量字典 ,但没有解决。

我可以用适当的语义实现一个不可变的包装器 ,但是这看起来还不完全正确。


对于那些有问题的人,我在一个生成的类中实现了IDataErrorInfo,并且正在寻找一种方法将columnName查find我的描述符数组中。

我没有意识到(testing时错字!)哦,开关接受string,所以这就是我要使用的。 谢谢!

在C#中创build一个真正的编译时生成的常量字典并不是一个简单的任务。 事实上,这里的答案都没有真正实现。

有一个解决scheme虽然符合你的要求,但不一定是一个很好的; 请记住,根据C#规范,开关大小表被编译为常量散列跳转表。 也就是说,它们是不变的字典,而不是一系列的if-else语句。 所以考虑一下这样的switch-case语句:

 switch (myString) { case "cat": return 0; case "dog": return 1; case "elephant": return 3; } 

这正是你想要的。 是的,我知道,这是丑陋的。

在当前的框架中有珍贵的不可变集合。 我可以想象.NET 3.5中的一个相对无痛的选项:

使用Enumerable.ToLookup()Lookup<,>类是不可变的(但在rhs上是多值的); 你可以很容易地从Dictionary<,>

  Dictionary<string, int> ids = new Dictionary<string, int> { {"abc",1}, {"def",2}, {"ghi",3} }; ILookup<string, int> lookup = ids.ToLookup(x => x.Key, x => x.Value); int i = lookup["def"].Single(); 
 enum Constants { Abc = 1, Def = 2, Ghi = 3 } ... int i = (int)Enum.Parse(typeof(Constants), "Def"); 

这是最接近“CONST词典”的东西:

 public static int GetValueByName(string name) { switch (name) { case "bob": return 1; case "billy": return 2; default: return -1; } } 

编译器将足够聪明,尽可能清洁地构build代码。

似乎没有任何标准的字典不可变的界面,所以创build一个包装器似乎是唯一合理的select,不幸的是。

编辑 :马克·格雷维尔find了我错过的ILookup – 这将允许你至less避免创build一个新的包装,尽pipe你仍然需要用.ToLookup()来转换字典。

如果这是一个需要限制到一个特定的情况下,你可能会更好的更多的业务逻辑接口:

 interface IActiveUserCountProvider { int GetMaxForServer(string serverName); } 

为什么不:

 public class MyClass { private Dictionary<string, int> _myCollection = new Dictionary<string, int>() { { "A", 1 }, { "B", 2 }, { "C", 3 } }; public IEnumerable<KeyValuePair<string,int>> MyCollection { get { return _myCollection.AsEnumerable<KeyValuePair<string, int>>(); } } }