我正在尝试在C#中编写一个函数,它将获取两个小的int值(范围0-3)并根据这些值返回一个Color
对象。问题在于无法以编程方式从两个值中确定颜色,它们特定于一种LED并且必须是硬编码的。
我能想到的最简单的方法是检查每个值的大量(16个案例)if-else语句,但这似乎不是一个非常优雅的解决方案。有没有更好的方法来确定颜色?
答案 0 :(得分:2)
如果你想采用OO方法(无论好坏),你可以使用元组 - >颜色映射:
Dictionary<Tuple<int, int>, Color> d = new Dictionary<Tuple<int, int>, Color>()
{
{Tuple.Create(2, 1), Color.Red},
{Tuple.Create(1, 1), Color.Blue},
{Tuple.Create(1, 2), Color.Green}
};
2-d数组的一个优点是它可以是稀疏的而没有空值。您也可以使用集合初始值设定项而无需按索引顺序初始化。如果你尝试使用两种颜色的相同元组,这将在初始化时抛出一个明显的ArgumentException
。
答案 1 :(得分:2)
Color对象的二维数组怎么样?
Color[,] colors = new[,] {
{ Color.FromArgb(1, 2, 3), Color.FromArgb(3, 4, 5), Color.FromArgb(6, 7, 8), Color.FromArgb(9, 10, 11) },
{ Color.FromArgb(21, 22, 23), Color.FromArgb(23, 24, 25), Color.FromArgb(26, 27, 28), Color.FromArgb(29, 30, 31) },
};
Color color = colors[index1, index2];
答案 2 :(得分:1)
作为使用if
/ else
的稍微更清晰的替代方法,您可以将颜色值放在数组中,并使用两个小的int值作为数组的索引。
答案 3 :(得分:0)
我投票给16种颜色的枚举
enum Color
{
red = 0,
blue = 1
}
public Color GetColor(int v1, int v2)
{
int colorValue = v1 << 8;
colorValue |= v2;
return (Color)colorValue;
}
答案 4 :(得分:0)
怎么样:
static Color GetColor(int c1, int c2)
{
if (c1 > 3 || c1 < 0 || c2 > 3 || c2 < 0)
throw new ArgumentOutOfRangeException();
var map = new Dictionary<string, Color>
{
{"00", Color.Black},
{"10", Color.Red},
{"20", Color.Blue},
// etc, etc...
{"11", Color.DimGray},
};
var key = c1.ToString() + c2.ToString();
return map[key];
}
答案 5 :(得分:0)
你有这两个小整数值组合在一起意味着什么(至少是一种颜色)的事实告诉我你可能有一个结构被定义来封装它们。
这样做的好处是你可以使用struct作为字典的关键字:Equals和GetHashCode方法应该已经充分发挥作用。
以下是一个例子。既然你提到颜色无法计算,我就留下了一个需要填充字典的注释;你可以硬编码,但理想情况下你会从文件或嵌入资源中读取值。
编辑:将我的示例结构更新为不可变的。
struct MyStruct
{
private byte _X;
private byte _Y;
public MyStruct(byte x, byte y)
{
_X = x;
_Y = y;
}
public byte X { get { return _X; } }
public byte Y { get { return _Y; } }
private static Dictionary<MyStruct, Color> _ColorMap;
static MyStruct()
{
_ColorMap = new Dictionary<MyStruct, Color>();
// read color mapping from somewhere...perhaps a file specific to the type of LED
}
public Color GetColor()
{
return _ColorMap[this];
}
}
答案 6 :(得分:-3)
避免一堆if else
语句的首选方法是使用Switch
。您还可以使用enum
并指定与您的小整数相对应的int值:
public enum ColorChoice
{
red = 01 //'01' instead of '1' to make clear your first digit is zero
blue = 02
green = 03
...etc...
]