2013-07-02 36 views
4

所以我试图创建的颜色字典的形式创建字典条目包含列表<int>

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到像参数:

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

还是我来存储颜色的选择,然后把每个值在像这样?

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

非常感谢任何能够帮助我的人! :)

+2

在您的C#代码中不需要'.ToList()'调用。你已经创建了一个新的列表!但是如果你总是要存储三个整数(RGB值),为什么要使用列表的开销?我会考虑使用内置类型,或者创建一个简单的'struct'。 –

+1

我编辑了你的标题。请参阅:“[应该在其标题中包含”标签“](http://meta.stackexchange.com/questions/19190/)”,其中的共识是“不,他们不应该”。 –

+0

我明白你的观点,我将如何去构造颜色?类似于 colDict.Add(“red”,Color(255,0,0)); ? – mbdavis

回答

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"]; 
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} ; 
+0

TGH明白了,非常感谢你的快速回答,但是我相信你也可以工作,如果我有15名代表,我会赞成。 – mbdavis

+0

也许.. hehe –

+0

现在得到了代表!呃 – mbdavis

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 
+0

天才,哇,不敢相信我没有尝试过,似乎只是尝试其他的一切!感谢您的快速响应! – mbdavis

2

根据您的使用情况,您可能更容易将RGB颜色存储在单个int值中。可以使用Color.FromArgb(Int32)从中获取颜色。因此,你的字典只需要存储<Color, int>(或者你可以用一个字符串作为键代替Color

为了节省您的时间不必每次调用ColorToInt方法,你可以创建一个extenstion方法。

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

它会自动计算Color.Green int值,并将其添加为你的价值。

+0

真棒回答!万分感谢! – mbdavis

+0

不客气:)以下是[扩展方法](http://www.dotnetperls.com/extension)的快速说明,以防您不熟悉它们。 – keyboardP

+0

从你的答案我实际上想出了一个更简化的方式: 使字典 'colDict = new Dictionary (); (“red”,Color.FromArgb(200,40,40)); (“绿色”,Color.FromArgb(40,200,40)); colDict.Add(“blue”,Color.FromArgb(40,40,200));' 现在我可以得到这样的颜色: 'colDict [“red”]' 我一定会学习关于扩展方法。您自动获取颜色RGB值的方法是天才,应该提到我希望能够始终指定RGB值!谢谢你的帮助!非常感谢。 – mbdavis