2011-03-19 53 views
2

一個specefied號碼是什麼我試圖做的就是給每一個項目在我的ListView有一個獨特的色彩。所以我有我的列表視圖中的項目數爲'計數'生成隨機的,但獨特的顏色

我的方法是調用下面的方法,並給我的項目的方法編號,然後它應該有一個數組,它保存第一個顏色,那麼當下一個顏色將被生成時,它應該與數組之前的顏色進行比較。

的問題是我無法弄清楚了我要什麼樣的陣列的需要的方式和如何比較陣列中的每個插入顏色與最後插入的顏色。這裏是我的代碼:

public Color GetUniqueRandomColor(int count){ 

for(int i = 0; i < count; i++) 
{ 
Color.FromArgb(randomColor.Next(70, 200), randomColor.Next(100, 225), randomColor.Next(100, 230)); 
} 

return Color.Red;} 

,這是一元件的外觀的陣列中:

顏色[A = 255,R = 132,G = 148,B = 181]

正如你可以看到我的方法仍然缺乏必要的陣列和算法,新插入的顏色與它比較。一些幫助和提示將appriciated!

+3

一點題外話...你正在生成的顏色,可能是非常相似的。如果你有能力,試着區分132,148,181和132,148,180! :-)技術上他們是不同的。 – xanatos 2011-03-19 12:25:53

+0

如果用戶看不到差異,那麼唯一性有什麼用? – CodesInChaos 2011-03-19 12:43:09

+0

正如你所說,接受的答案解決了你的問題,是的。但我不認爲你的使用將能夠告訴它除了不強制唯一性的天真算法。 – CodesInChaos 2011-03-19 12:57:06

回答

3

用C#3.5

public static Color[] GetUniqueRandomColor(int count) 
{ 
    Color[] colors = new Color[count]; 
    HashSet<Color> hs = new HashSet<Color>(); 

    Random randomColor = new Random(); 

    for(int i = 0; i < count; i++) 
    { 
     Color color; 
     while (!hs.Add(color = Color.FromArgb(randomColor.Next(70, 200), randomColor.Next(100, 225), randomColor.Next(100, 230)))); 
     colors[i] = color; 
    }  

    return colors; 
} 

如果你只有C#2.0中,你可以用一個字典,其中布爾是唯一的,你不會使用佔位符代替HashSet的,但同時表示將獲得稍微複雜一點

public static Color[] GetUniqueRandomColor(int count) 
{ 
    Color[] colors = new Color[count]; 
    Dictionary<Color, bool> hs = new Dictionary<Color, bool>(); 

    Random randomColor = new Random(); 

    for (int i = 0; i < count; i++) 
    { 
     Color color; 
     while (hs.ContainsKey(color = Color.FromArgb(randomColor.Next(70, 200), randomColor.Next(100, 225), randomColor.Next(100, 230)))) ; 
     hs.Add(color, true); 
     colors[i] = color; 
    } 

    return colors; 
} 
+2

A bodyless while。醜陋。國際海事組織你應該把這個任務分配給'color'和'while'條件。如果你在沒有主體的情況下使用'while',至少要在新行中添加'{}'來表明這一點。 – CodesInChaos 2011-03-19 12:45:31

+1

當你接近'2 112 500'項目時,這個算法變得越來越慢,並且一旦唯一性條件不再被滿足,它將最終陷入無限循環。 – CodesInChaos 2011-03-19 12:48:25

+0

對他們兩人都是+1 ......而且我知道它......但是當你必須與SO的文本編輯器作戰時,{}在一個新的行中是痛苦的:-)而對於第二點......他的(OP)是規則,他是痛苦。真正的問題是它可能產生幾乎相同的顏色。我不會爲我做類似於此代碼的事情。 :-)我會做一些基於與顏色之間的最小距離HSL空間(技術上我已經這樣做一次) – xanatos 2011-03-19 12:55:58

0

我將填充「使用的顏色」列表,所以每次你打電話Color.FromArgb您可以在列表中選中它之前產生新的顏色。如果顏色存在,您將再次調用隨機函數,否則生成顏色並將該值添加到列表中。

+0

謝謝,但是如何在列表中存儲顏色? – 2011-03-19 11:52:58

+0

您可以創建一個簡單的POCO類的顏色。是這樣的:公共類MyColor {詮釋紅{獲取;集;} INT綠{獲取;集;}詮釋藍{獲取;集;}}然後在你的函數的IList 創建和比使用添加,刪除或LINQ語句來完成你的比較。或者你直接使用.NET框架的Color類(IList ) – Iridio 2011-03-19 12:04:17