2010-06-14 57 views
1

我試圖避免在.net 2.0中很快成爲3.5應用程序的硬編碼。在C#應用程序中訪問硬編碼數據

我有一個很大的枚舉,我希望將1映射到1到一組字符串。每個枚舉值還將映射爲指示動作的2個值中的1個值。現有的代碼用一個大的switch語句來做到這一點,但這對我來說似乎很難看。

有更好的存儲和訪問數據的方式嗎?

我已經考慮過resx文件,但是當您考慮到設計器文件包含的硬編碼值同樣多時,它似乎沒有多大意義。

在程序集中嵌入xml文件是個好主意嗎?

是一個大開關語句不像看起來那麼糟糕?

有沒有更好的解決方案?

回答

0

儘管開關語句是多麼醜陋,但它是將枚舉映射到字符串的最有效方式。嵌入一​​個XML文件將膨脹你的程序集的大小,並且獲取所需的字符串值將花費更長的時間。

+0

雖然不理想我決定這可能是最簡單的解決方案。 – haymansfield 2010-06-23 08:18:56

1

您可以使用Enum description屬性爲每個枚舉值分配一個字符串。我不知道它是否比switch語句更有效,但它確實具有在定義枚舉的代碼中將相同位置的字符串值賦值的優點。

CodeProject有一篇文章here。還有一個很好的例子here

+0

這些都是映射字符串的好主意,但我也需要映射到第二個2值屬性,這是我無法用您的解決方案完成的。 – haymansfield 2010-06-14 15:41:08

+0

您可以隨時定義您自己的自定義屬性。請參閱http://msdn.microsoft.com/en-us/library/aa288454%28VS.71%29.aspx。唯一的問題是你需要使用反射來獲取值,所以它可能不會像switch語句那樣高效。 – TLiebe 2010-06-14 15:48:26

+0

僅當由於性能下降而沒有其他選項時才應使用反射。 – 2010-06-14 16:47:00

0

另請參閱this問題的答案。

恕我直言,大開關語句總是代碼味道,並且不可能維護。

+0

這些都是映射字符串的好主意,但我還需要映射到第二個2值屬性,這是我無法用您的解決方案實現的。 – haymansfield 2010-06-14 15:41:54

+0

那麼,使用另一個字典,或使用'Dictionary ' – SWeko 2010-06-14 17:27:17

0

在這種情況下使用一個枚舉試圖適合一個圓形孔中的方形釘。儘管XML對於你想要做的事情來說過於誇張。

請改用字典。這樣,就有了一個直接的'key => value'關係,這個值可以是任何東西。

爲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]); 
} 

一個枚舉就是一個榮耀的詞典。這就是爲什麼你不會在很多其他語言(尤其是動態類型語言)中看到它們的原因。

相關問題