我试图避免在.net 2.0中硬编码很快成为3.5应用程序。
我有一个很大的枚举,我希望将1到1映射到一组字符串。每个枚举值也将映射到表示操作的2个值中的1个。现有的代码用一个很大的switch声明来做这个,但这对我来说似乎很难看。
是否有更好的存储和访问数据的方法?
我考虑过resx文件但是当你认为设计器文件包含的硬编码值一样多时,它似乎有点无意义。
在程序集中嵌入一个xml文件是个好主意吗?
一个重要的转换声明没有看起来那么糟糕吗?
有更好的解决方案吗?
答案 0 :(得分:1)
您可以使用Enum description属性为每个枚举值指定一个字符串。我不知道它是否比switch语句更有效,但它确实具有在枚举定义的代码中将字符串值分配到同一位置的优势。
答案 1 :(得分:0)
尽管switch语句有多么丑陋,但它是将枚举映射到字符串的最有效方法。嵌入XML文件只会增加程序集的大小,并且需要更长的时间才能获得所需的字符串值。
答案 2 :(得分:0)
另请参阅this问题的答案。
恕我直言,大转换语句总是代码味道,并且无法维护。
答案 3 :(得分:0)
在这种情况下使用枚举试图将方形钉固定在圆孔中。虽然XML对你正在尝试做的事情来说太过分了。
请改用词典。这样,有一个直接'key =>价值'关系,价值可以是任何东西。
对于1-1字符串字符串关系,请使用:
Dictionary<string, string> dictA = new Dictionary<string, string>();
dictA.Add("string1", "value1");
dictA.Add("string2", "value2");
dictA.Add("string3", "value3");
要访问字典的所有值,请使用:
foreach (KeyValuePair<string, string> item in dictA)
{
Console.WriteLine("Key: {0}; Value: {1};", item.Key, item.Value);
}
如果您需要1-2 1-3或1-n字符串关系,请使用:
Dictionary<string, List<string>> dictB = new Dictionary<string, List<string>>();
dictB.Add("string1", new List<string>() {"value1A", "value1B"});
dictB.Add("string2", new List<string>() {"value2A", "value2B"});
dictB.Add("string3", new List<string>() {"value3A", "value3B"});
要访问字典的所有值,请使用:
foreach (KeyValuePair<string, List<string>> item in dictB)
{
Console.WriteLine("Key: {0}; Values: {1}, {2};", item.Key, item.Value[0], item.Value[1]);
}
如果您需要交错数组关系,请使用以下命令:
Dictionary<string, List<string>> dictB = new Dictionary<string, List<string>>();
dictB.Add("string1", new List<string>() {"value1A", "value1B, value1C"});
dictB.Add("string2", new List<string>() {"value2A", "value2B, value2C, value2D"});
dictB.Add("string3", new List<string>() {"value3A", "value3B"});
要访问字典的所有值,请使用:
foreach (KeyValuePair<string, List<string>> item in dictB)
{
string values = "";
int valLen = ((List<string>)item.Value).Count;
for (int i = 0; i < valLen; i++)
{
if (i == (valLen - 1))
{
values += item.Value[i] + "";
}
else
{
values += item.Value[i] + ", ";
}
}
Console.WriteLine("Key: {0}; Values: {1};", item.Key, values);
}
要获取特定键的值,请执行以下操作:
string match = "string2";
if (dictD.ContainsKey(match))
{
Console.WriteLine("The value for Key='{0}' is: '{1}'", match, dictD[match]);
}
Enums只不过是一首荣耀的词典。这就是为什么你不会在很多其他语言中看到它们(特别是动态类型语言)。