4

所以我试图在表单中创建一个颜色字典

Dictionary<string,List<int>> 

像这样:

(colour:colourvals)

例如,如果颜色是红色:

("red":(255,0,0))

我对 c# 很陌生(大约 1 周),但我有相当多的 python 经验。我试图在 python 中实现的效果如下所示:

col_dict = {"red":(255,0,0),
            "blue":(255,0,0),
            "green":(255,0,0)}

回到 c#,经过大量的修补,我终于设法做出了一些可行的东西。这是我拥有的当前代码(看起来很乱):

colDict = new Dictionary<string, List<int>>();
colDict.Add("red", new List<int> { 200, 40, 40 }.ToList());
colDict.Add("green", new List<int> { 40, 200, 40 }.ToList());
colDict.Add("blue", new List<int> { 40, 40, 200 }.ToList());

首先,有没有更好的方法来做到这一点?

其次,我想使用列表值作为 Color.FromArgb() 的参数。有什么方法可以将 colDict 中的 List 放入参数中,例如:

Color.FromArgb(colDict["green"]);

还是我必须存储颜色选择,然后像这样输入每个值?

this.col = colDict[colour];
Color.FromArgb(this.col[0],this.col[1],this.col[2]));

非常感谢任何可以帮助我的人!:)

4

4 回答 4

2

我认为你需要的是一个Dictionary<string, Vector3D>. 自己创建一个 Vector3D 类/结构很容易,因为我认为它不随 .NET 框架一起提供:

public class Vector3D
{
  public int R{get;set;}
  public int G{get;set;}
  public int B{get;set;}

}
dict["red"] = new Vector3D{R=255,G=0,B=0} ;
于 2013-07-02T23:53:01.790 回答
2

根据您的使用情况,您可能会发现将 RGB 颜色存储在单个 int 值中更容易。

public int ColorToInt(byte r, byte g, byte b)
{
   return (b << 16) | (g << 8) | r;
}

您可以使用Color.FromArgb(Int32)从中获取颜色。因此,您的字典只需存储<Color, int>(或者您可以替换Color为字符串作为键)

为了节省您每次都调用该ColorToInt方法的时间,您可以创建一个扩展方法。

public static void AddRGB(this Dictionary<Color, int> dict, Color col)
{
   int rgbint = (col.B << 16) | (col.G << 8) | col.R;
   dict.Add(col, rgbint);
}

所以每当你想向字典中添加一个项目时,你都可以这样做

Dictionary<Color, int> colDict = new Dictionary<Color, int>();
colDict.AddRGB(Color.Green);

它将自动计算 int 值Color.Green并将其添加为您的值。

于 2013-07-02T23:59:56.177 回答
1

您不需要 ToList 因为它已经是一个列表:

            var colDict = new Dictionary<string, List<int>>();
            colDict.Add("red", new List<int> { 200, 40, 40 });
            colDict.Add("green", new List<int> { 40, 200, 40 });
            colDict.Add("blue", new List<int> { 40, 40, 200 });

像这样访问值:

colDict["green"][0]
colDict["green"][1]
colDict["green"][2]


Color.FromArgb(colDict["green"][0],colDict["green"][1],colDict["green"][2]));

创建值的另一种方法是使用元组

var colDict = new Dictionary<string, Tuple<int,int,int>>();
colDict.Add("red", new Tuple<int,int,int>(40,45,49));

 colDict["red"].Item1
 colDict["red"].Item2
 colDict["red"].Item3
于 2013-07-02T23:53:10.080 回答
0

最后我想通了,但是没有大家的帮助我是做不到的!首先使用字符串键和颜色值创建字典:

colDict = new Dictionary<string, Color>(); 

然后可以像这样添加颜色:

colDict.Add("red", Color.FromArgb(200, 40, 40)); 
colDict.Add("green", Color.FromArgb(40, 200, 40)); 
colDict.Add("blue", Color.FromArgb(40, 40, 200)); 

然后可以引用颜色,并且可以像这样作为“颜色”数据类型轻松访问:

colDict["red"]; 
于 2013-07-10T15:01:23.727 回答