【问题标题】:Better way to switch Brush colours?切换画笔颜色的更好方法?
【发布时间】:2020-01-05 08:37:27
【问题描述】:

我是 C# 新手,正在从事一个蛇项目。 我正在尝试让它变成彩虹色,有没有更好的方法在六种颜色之间切换然后重复?

public Brush Colour(int i)
{
    Brush snakeColour;
    switch (i)
    {
        case 0:
        case 6:
        case 12: 
        case 18: 
        case 24:
            snakeColour = Brushes.HotPink;
            break;

        case 1: 
        case 7: 
        case 13: 
        case 19: 
        case 25:
            snakeColour = Brushes.Orange;
            break;

        case 2: 
        case 8: 
        case 14: 
        case 20: 
        case 26:
            snakeColour = Brushes.PeachPuff;
            break;

        etc.

        default:
            snakeColour = Brushes.White;
            break;
    }

    return snakeColour;
}

有什么建议吗?

【问题讨论】:

  • 你只是在寻求一种更简洁的书写方式吗?
  • 您可以在i % 6 上使用switch,然后只需要每组case 标签中的第一个。

标签: c# winforms


【解决方案1】:

如果您使用余数运算符(并且假设输入为非负数),您就会知道您的值始终在 0 到 5 之间,因此您根本不需要切换 - 只需使用数组:

private static readonly Brush[] brushes =
{
    Brushes.HotPink,
    Brushes.Orange,
    Brushes.PeachPuff,
    ...
    Brushes.White
};

// TODO: Potentially rename from using "position" to something else,
// based on what the parameter is really meant to represent.
public Brush GetBrushForPosition(int position) => brushes[position % 6];

如果输入可能为负数,您可以使用稍微冗长的 ((position % 6) + 6) % 6 表达式作为数组索引,它仍然会适当地循环。 (当然还有其他方法,但这相当简单。)

【讨论】:

    【解决方案2】:

    您可以使用modulus operator 减少case 标签的数量:

    public Brush Colour(int i)
    {
        Brush snakeColour;
        switch (i % 6)
        {
            case 0:
                snakeColour = Brushes.HotPink;
                break;
    
            case 1:
                snakeColour = Brushes.Orange;
                break;
    
            case 2:
                snakeColour = Brushes.PeachPuff;
                break;
    
    //      etc.
    
            default:
                snakeColour = Brushes.White;
                break;
    
        }
    
        return snakeColour;
    }
    

    但请注意:这很可能会消除您对default 案例的需求(假设您已经处理了从05 的所有案例)。如果实际的i 值超出特定范围,那可能可能与您的意图相反!

    【讨论】:

      【解决方案3】:

      通过使用 % 运算符,您可以使您的代码更简单。这是@Adrian Mole 的建议...

       public Brush Colour(int i)
              {
                  Brush snakeColour;
                  i %= 6;
                  switch (i)
                  {
                      case 0:
                          snakeColour = Brushes.HotPink;
                          break;
      
                      case 1:
                          snakeColour = Brushes.Orange;
                          break;
      
                      case 2:
                          snakeColour = Brushes.PeachPuff;
                          break;
      
                      default:
                          snakeColour = Brushes.White;
                          break;
      
                  }
                  return snakeColour;
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-12
        • 1970-01-01
        相关资源
        最近更新 更多