生成指定数量的随机但唯一的颜色

时间:2011-03-19 11:40:32

标签: c# arrays random colors unique

我想要做的是让listView中的每个项目都具有独特的颜色。所以我的列表视图中的项目数为'count'

我的方法是调用下面的方法并给出我的项目的方法编号,然后它应该有一个保存第一种颜色的数组,然后当要生成下一种颜色时,它应该与之前的颜色进行比较在阵列中。

问题是我无法弄清楚我需要什么样的阵列的方法,以及如何比较阵列中的每个插入颜色和最后插入的颜色。这是我的代码:

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]

正如您所看到的,我的方法仍然缺少所需的数组和比较新插入颜色的算法。一些帮助和提示将受到关注!

2 个答案:

答案 0 :(得分: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,其中bool只是一个你不会使用的占位符,但是while表达式会更复杂一些

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

答案 1 :(得分:0)

我将填充“使用过的颜色”列表,因此每次在调用Color.FromArgb之前生成新颜色时,您都可以在列表中进行检查。如果颜色存在,您将再次调用随机函数,否则生成颜色并将值添加到列表中。