2010-05-08 34 views
1

是否可以以更好的方式有沒有寫這個switch語句中的任何替代方法(C#3.0)

public static EnumFactorType GetFactorEnum(string str) 
     { 
      Standardization e = new Standardization(); 
      switch (str.ToLower()) 
      { 
       case "beta": 
        e.FactorType = EnumFactorType.BETA; 
        break; 
       case "bkp": 
        e.FactorType = EnumFactorType.BOOK_TO_PRICE; 
        break; 
       case "yld": 
        e.FactorType = EnumFactorType.DIVIDEND_YIELD; 
        break; 
       case "growth": 
        e.FactorType = EnumFactorType.GROWTH; 
        break; 
       case "mean": 
        e.FactorType = EnumFactorType.MARKET_CAP; 
        break; 
       case "momentum": 
        e.FactorType = EnumFactorType.MOMENTUM; 
        break; 
       case "size": 
        e.FactorType = EnumFactorType.SIZE; 
        break; 
       case "stat_fact1": 
        e.FactorType = EnumFactorType.STAT_FACT_1; 
        break; 
       case "stat_fact2": 
        e.FactorType = EnumFactorType.STAT_FACT_2; 
        break; 
       case "value": 
        e.FactorType = EnumFactorType.VALUE; 
        break; 
      } 
      return e.FactorType; 
     } 

做。如果我創建了一個靜態類(比如Constatant),並聲明變量像

public static string BETA= "beta"; 

,然後如果我嘗試把在CASE表達式像

Case Constants.BETA : e.FactorType = EnumFactorType.BETA; 
         break; 

那麼編譯器會報告錯誤。(相當EXPEC TED)

那麼,有沒有其他的方式(我canot改變開關語句)

使用C#3.0

感謝

+0

如果您可以更改'switch'語句,請使用'Enum.Parse'。 – kennytm 2010-05-08 08:11:02

+1

@KennyTM:但是,交換機中的某些字符串不符合枚舉中的名稱。 – Guffa 2010-05-08 08:14:44

回答

7

您可以將Dictionary<string, EnumFactorType>定義爲「映射」並使用它。它本質上是相同的邏輯,但可以更具可讀性。

首先,在映射對象:

private Dictionary<string, EnumFactorType> _mapping = new Dictionary<string, EnumFactorType> 
{ 
    { "beta", EnumFactorType.BETA }, 
    { "bkp", EnumFactorType.BOOK_TO_PRICE }, 
    // etc 
} 

然後在您的方法:

e.FactorType = _mapping[str.ToLower()]; 

您可能需要調用_mapping.ContainsKey(STR)第一隻是要確定的映射存在。

+1

如果需要確保映射存在,請使用TryGetValue方法。否則,你正在做兩個相同的查找。 – Thorarin 2010-05-08 08:16:32

+1

可能想讓_mapping靜態;你不想爲每個實例生成一個,你會嗎? – pdr 2010-05-08 08:18:37

+0

非常好的解決方案 – 2010-05-09 04:51:14

3

用途:

public const string BETA = "beta"; 

工作正常。你聲明它的方式,它是一個變量。 case表達式中不允許使用變量。通過使用const關鍵字,您可以告訴編譯器它實際上是一個常量,正如您的類名所示。

你是什麼意思的「我不能改變switch語句」?有了足夠多的可能性,我會考慮使用字典。請注意,這主要是爲了可讀性和可維護性,而不是性能。使用字典時,例如可以更容易地進行反向轉換,因爲您可以從相同的數據構建反向字典。

使用字典,它會是這個樣子:

private static readonly Dictionary<string, EnumFactorType> _factorTypeMap = 
new Dictionary<string, EnumFactorType>(StringComparer.InvariantCultureIgnoreCase) 
{ 
    { "beta", EnumFactorType.BETA }, 
    { "bkp", EnumFactorType.BOOK_TO_PRICE }, 
    // etc. You can still use strings constants here instead of literals. 
}; 

然後在你的方法:

EnumFactorType factorType; 
if (_factorTypeMap.TryGetValue(str, out factorType)) 
{ 
    e.FactorType = factorType; 
} 
else 
{ 
    throw new Exception("Unexpected value, bla bla"); 
} 

如果你是一定的值存在,它更簡單:

e.FactorType = _factorTypeMap[str]; 

創建一個反向字典是一行,在這裏顯示在兩行:)

Dictionary<EnumFactorType, string> _factorTypeReverseMap = 
    _factorTypeMap.ToDictionary(kvp => kvp.Value, kvp => kvp.Key); 
1

在交換機中使用的字符串是恆定的,所以如果你聲明一個常量的變量,你可以在交換機使用它:

public const string BETA = "beta"; 

如果你不想字符串要保持不變,以便在程序運行時更改它們,但不能使用開關。然後,您可以使用Dictionary<string, EnumFactorType>查找值以獲得與交換機類似的性能。

+0

當他編譯器將其設置爲const時,沒有必要像上面提到的那樣執行此操作。我們不需要創建一個const,因爲我們沒有重用這個值。 – LCarter 2011-11-10 23:28:26

+0

@LCarter:當然這沒有意義,但它回答了這個問題。 – Guffa 2011-11-11 01:04:26

相關問題