带颜色的开关/外壳

时间:2013-10-28 13:31:11

标签: c# colors switch-statement case

快速简单的问题:

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

我能做的是:

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

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

或者我可以使用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 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

    var c = KnownColor.Red;

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

答案 2 :(得分:1)

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

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

以下是一些演示这两种方法的示例代码。我使用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();
        }
    }
}

答案 3 :(得分:0)

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

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