2

快速简单的问题:

如何制作具有多种颜色的开关/外壳。

我能做的是:

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;
}

我发现了这篇有趣的文章,我可能会决定使用它。

或者我正在考虑类似的事情

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

大家觉得哪个好呢?

4

4 回答 4

3

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

于 2013-10-28T13:35:03.927 回答
2

我认为在你的情况下 KnownColor 枚举会完成这项工作,但你在这里的颜色有限

    var c = KnownColor.Red;

    switch (c)
    {
        case KnownColor.Red:
            Console.WriteLine("true");
            break;
        default:
            Console.WriteLine("False");
            break;
    }
于 2013-10-28T13:40:22.577 回答
2

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

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

这是一些演示这两种方法的示例代码。我正在使用 aLazy<>来初始化颜色/动作映射器以避免任何潜在的线程问题:

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();
        }
    }
}
于 2013-10-28T13:57:19.073 回答
0

如果您固定使用 switch 语句,则可以执行以下操作以结合相对易于编码/人类可读性:

switch(color.ToString())
{
   case "Color [Red]":
      //...
      break;
   //...
}
于 2013-10-28T13:42:59.787 回答