2017-08-14 47 views
1

這是一個完成的羅馬到十進制數字轉換器。可以避免if-else

Dictionary<char,int> nTrans = new Dictionary<char,int>(); 
      nTrans.Add('I',1); 
      nTrans.Add('V', 5); 
      nTrans.Add('X', 10); 
      nTrans.Add('L', 50); 
      nTrans.Add('C', 100); 
      nTrans.Add('D', 500); 
      nTrans.Add('M', 1000); 

      string rNum = "XV"; 
      int dNum = 0; 

      for (int i = 0; i < rNum.Length; i++) 
      { 
       if (i < rNum.Length-1) 
       { 
        if (nTrans[rNum[i]] < nTrans[rNum[i + 1]]) 
        { 
         dNum -= nTrans[rNum[i]]; 
        } 
        else 
        { 
         dNum += nTrans[rNum[i]]; 
        } 
       } 
       else 
       { 
        dNum += nTrans[rNum[i]]; 
       } 
      } 

但我無法弄清楚如何使用這個if-else語句逃脫

if (i < rNum.Length-1) 
{ 
//Code 
} 
else 
{ 
dNum += nTrans[rNum[i]]; 
} 

任何建議,我怎麼能避免使用它?這個問題只是爲了優化和提高我的編程技能!

+2

我不知道你是否應該問這個說_Code Review_ SE? – MickyD

+0

'dNum = nTrans [rNum [i]] Spectarion

+0

@Spectarion雖然你消除了一個明確的if,但你的代碼與原始代碼具有相同的源代碼_cyclomatic complexity_。 http://www.ndepend.com/docs/code-metrics#CC – MickyD

回答

4

您可以處理循環中0到rNum.Length - 1之間的所有內容,然後處理最後一個之外的內容嗎?

喜歡的東西:

for (int i = 0; i < rNum.Length - 1; i++) 
{ 
// do regular stuff 
} 

if (rNum.Length != 0) 
    dNum += nTrans[rNum[rNum.Length - 1]]; 

如果這是一個功能,您可以將檢查rNum.Length == 0移動到頂部,就回到0作爲dNum如果這是真的。這樣你可以跳過所有額外的處理。

+0

這個Weeee不僅更快(減少循環期間的條件檢查),還減少了_cyclomatic複雜性_。 http://www.ndepend.com/docs/code-metrics#CC +1 – MickyD

-3

Case語句可以提高可讀性,也可以是一個命令映射/字典,其中每個計算都存儲在字典/映射中並直接查找。

+2

是的,但這有什麼相關的? – MickyD