2015-11-17 45 views
0

如何讓此代碼在體積上更小且更高效:) ..? 到目前爲止,我已經做到了,從一個更大的舊代碼,但我認爲它仍然是巨大的。在以下代碼中簡化開關語句

if (affix == Mod.Affix) 
{ 
    Graphics.DrawText(text, textSize, position, Color.White); 

    switch (levels) 
    { 
     case 1: 
     { 
      Size level = Graphics.DrawText(text, textSize, position, Color.Yellow); 
      if (level != new Size()) 
      { 
       position.Y += level.Height; 
      } 
     } break; 

     case 2: 
     { 
      Size level = Graphics.DrawText(text, textSize, position, Color.Red); 
      if (level != new Size()) 
      { 
       position.Y += level.Height; 
      } 
     } break; 

     case 3: 
     { 
      Size level = Graphics.DrawText(text, textSize, position, Color.Green); 
      if (level != new Size()) 
      { 
       position.Y += level.Height; 
      } 
     } break; 

     default: 
      Size nextLevel = Graphics.DrawText(text, textSize, position, Color.Black); 

      if (nextLevel != new Size()) 
      { 
       position.Y += nextLevel.Height; 
      } 
     break; 
    } 
} 

預先感謝您!

+1

你是什麼試着在做'if(level!= new Size())'時完成? –

+0

@Matias Cicero - 將文本對齊在同一位置。 –

+0

在情況1-3中,您需要維護的是「顏色」。其餘代碼可以在開關外移動。 –

回答

4

使用字典的水平映射到顏色:

private static Dictionary<int, Color> levelColors = new Dictionary<int, Color> 
{ 
    { 1, Color.Yellow }, 
    { 2, Color.Red }, 
    { 3, Color.Green } 
}; 

然後,您可以將您的方法更改爲:

Color color; 
if (!levelColors.TryGetValue(levels, out color)) // try and get the color for the level 
{ 
    color = Color.Black; // Default to black if no level color found 
} 

Size level = Graphics.DrawText(text, textSize, position, color); 
if (level != new Size()) 
{ 
    position.Y += level.Height; 
} 

這樣,您不需要在添加/更改關卡顏色時修改方法,只需更新字典即可。

+0

這看起來像是最好的解決方案,如果我需要,我可以添加更多的關卡。非常感謝你。 –

4

嘗試是這樣的:

Color color = new Color(); 
switch (levels) 
{ 
    case 1: 
     color = Color.Yellow; 
     break; 

    case 2: 
     color = Color.Red; 
     break; 

    case 3: 
     color = Color.Green; 
     break; 

    default: 
     color = Color.Black; 
     break; 
} 
Size level = Graphics.DrawText(text, textSize, position, color); 
if (level != new Size()) // ??? 
{ 
    position.Y += level.Height; 
} 
3

你正在做相同的代碼爲每個顏色,試試這個:

switch (levels) 
{ 
    case 1: 
     AddHeight(Color.Yellow); 
     break; 
    case 2: 
     AddHeight(Color.Red); 
     break; 
    case 3: 
     AddHeight(Color.Green); 
     break; 
    default: 
     AddHeight(Color.Black); 
     break; 
} 

public void AddHeight(Color color){ 
    Size level = Graphics.DrawText(text, textSize, position, color); 
    if (level != new Size()) // ??? 
    { 
     position.Y += level.Height; 
    } 
} 
-2
if (affix == Mod.Affix) 
{ 
    Graphics.DrawText(text, textSize, position, Color.White); 

    Size level = 
     (levels == 1) ? Graphics.DrawText(text, textSize, position, Color.Yellow) 
     :((levels == 2) ? Graphics.DrawText(text, textSize, position, Color.Red) 
     : ((levels == 3) ? Graphics.DrawText(text, textSize, position, Color.Green) 
     : Graphics.DrawText(text, textSize, position, Color.Black))); 

    if (level != new Size()) 
    { 
     position.Y += nextLevel.Height; 
    } 
} 
+0

這很快就難以閱讀,嵌套的三元運算符相當邪惡! –

+0

是的,我同意,但他要求更短 - 我不是可讀性的原因之一。 – GPicazo

+0

那麼爲什麼建議呢? –

0

你可以有一個predifined映射 「level_to_color」 等(例如在靜態構造函數initialzed):

Dictionary<int,Color> _levelToColor = new Dictionary<int,Color>(); 
_levelToColor.Add(1, Color.Yellow); 
_levelToColor.Add(2, Color.Red); 
_levelToColor.Add(3, Color.Green); 

然後你的代碼可能是這樣的:

Color color = _levelToColor.ContainsKey(level) ? _levelToColor[level] : Color.Black; 
Size level = Graphics.DrawText(text, textSize, position, color); 
position.Y += level.Height;