将两个值映射到一个对象

时间:2010-08-02 18:11:22

标签: c# .net-3.5 data-structures

我正在尝试在C#中编写一个函数,它将获取两个小的int值(范围0-3)并根据这些值返回一个Color对象。问题在于无法以编程方式从两个值中确定颜色,它们特定于一种LED并且必须是硬编码的。

我能想到的最简单的方法是检查每个值的大量(16个案例)if-else语句,但这似乎不是一个非常优雅的解决方案。有没有更好的方法来确定颜色?

7 个答案:

答案 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...
]