快速简单的问题:
我能做的是:
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?
// ...
}
你们认为哪个更好?
答案 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;
//...
}