генерирование определенного количества случайных, но уникальных цветов - PullRequest
2 голосов
/ 19 марта 2011

То, что я пытаюсь сделать, это дать каждому элементу в моем 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 ]

3 голосов
/ 19 марта 2011

С 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;
}
0 голосов
/ 19 марта 2011

Я буду заполнять список «используемых цветов», поэтому каждый раз, когда вы генерируете новый цвет перед вызовом Color.FromArgb, вы можете проверить его в своем списке. Если цвет существует, вы снова вызовете случайную функцию, иначе вы создадите цвет и добавите значение в список.

...