2015-11-17 40 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;