首页 文章

带颜色的开关/外壳

提问于
浏览
1

快速简单的问题:

如何使用大量颜色制作开关/盒子 .

我能做的是:

if(color == Color.Red)
    color = Color.Green;
else
{
    if(color == Color.Green)
        color = Color.Blue;
    else
    {
        // ...
    }
}

或者我可以使用旧/新颜色来替换它们(在此特定示例中,除了指定新颜色之外,不需要额外的工作) .

或者我可以使用tmp变量,因此它变为(但在这种特定情况下):

Color tmp = Color.Transparent; // or whatever
if(color == Color.Red)
    tmp = Color.Green;
if(color == Color.Green)
    tmp = Color.Blue;
//...
color = tmp;

我想要的是类似的东西

switch(color)
{
    case Color.Red:
        // ...
        break;
    case Color.Green:
        // ...
        break;
    case Color.Blue:
        // ...
        break;
}

我发现this有趣的文章,我可能决定使用它 .

或者我在想类似的东西

switch(color.ToArgb())
{
    case 129381038: // Color.Red?? how to put it here nicely?
        // ...
}

你们认为哪个更好?

4 回答

  • 1

    使用字典代码更少,更灵活,因为您可以从配置文件或数据库加载它 . 如果需要更改映射,则无需重建代码 .

  • 1

    我认为在你的情况下,KnownColor enum会完成这项工作,但是这里的颜色受到限制

    var c = KnownColor.Red;
    
        switch (c)
        {
            case KnownColor.Red:
                Console.WriteLine("true");
                break;
            default:
                Console.WriteLine("False");
                break;
        }
    
  • 0

    我绝对认为使用字典将是最好的方法 .

    但是,如果您真的喜欢switch语句,可以使用 Color.Name 并启用它 . Color.Name 将返回颜色的已知名称(如果有),如果不是,则返回颜色的十六进制argb代码 .

    这里's some sample code that demonstrates both approaches. I' m使用 Lazy<> 来初始化颜色/动作映射器以避免任何潜在的线程问题:

    using System;
    using System.Collections.Generic;
    using System.Drawing;
    
    namespace Demo
    {
        class Program
        {
            private void run()
            {
                test1(Color.Red);
                test1(Color.Green);
                test1(Color.FromArgb(0xea, 0x36, 0xbe));
                test1(Color.FromArgb(0x24, 0x67, 0xc0));
    
                test2(Color.Red);
                test2(Color.Green);
                test2(Color.FromArgb(0xea, 0x36, 0xbe));
                test2(Color.FromArgb(0x24, 0x67, 0xc0));
            }
    
            private void test1(Color colour)
            {
                switch (colour.Name)
                {
                    case "Red":
                    {
                        Console.WriteLine("Red");
                        break;
                    }
    
                    case "Green":
                    {
                        Console.WriteLine("Green");
                        break;
                    }
    
                    case "ffea36be":
                    {
                        Console.WriteLine("My custom colour");
                        break;
                    }
    
                    default:
                    {
                        Console.WriteLine("Unknown colour: " + colour.Name);
                        break;
                    }
                }
            }
    
            private void test2(Color colour)
            {
                Action action;
    
                if (_colourMapper.Value.TryGetValue(colour, out action))
                    action();
                else
                    Console.WriteLine("Unknown colour: " + colour.Name);
            }
    
            private static Dictionary<Color, Action> createColourMapper()
            {
                var result = new Dictionary<Color, Action>();
    
                result[Color.Red] =                        () => Console.WriteLine("Red");
                result[Color.Green] =                      () => Console.WriteLine("Green");
                result[Color.FromArgb(0xea, 0x36, 0xbe)] = () => Console.WriteLine("My custom colour");
    
                return result;
            }
    
            private readonly Lazy<Dictionary<Color, Action>> _colourMapper = new Lazy<Dictionary<Color, Action>>(createColourMapper);
    
            static void Main(string[] args)
            {
                new Program().run();
            }
        }
    }
    
  • 2

    如果你已经修改了使用switch语句,你可以执行以下操作来结合相对容易的编码/人类可读性:

    switch(color.ToString())
    {
       case "Color [Red]":
          //...
          break;
       //...
    }
    

相关问题