2013-07-02 67 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