如何在C#中生成随机颜色名称

55
我需要生成随机的颜色名称,例如“红色”,“白色”等。我该如何做呢?我可以像这样生成随机颜色:
Random randonGen = new Random();
Color randomColor = Color.FromArgb(randonGen.Next(255), randonGen.Next(255), 
randonGen.Next(255));

但我需要的是颜色名称,而并非所有生成的颜色都有已知的名称。

谢谢


1
不是每种颜色都有一个名字,它们太多了。你想要一个“最佳猜测”的颜色名称吗?如果是这样的话,你会如何称呼一种恰好处于蓝色和绿色中间的颜色? - Adriano Carneiro
16个回答

94

使用 Enum.GetValue 方法来检索 KnownColor 枚举的值,并获取一个随机值:

Random randomGen = new Random();
KnownColor[] names = (KnownColor[]) Enum.GetValues(typeof(KnownColor));
KnownColor randomColorName = names[randomGen.Next(names.Length)];
Color randomColor = Color.FromKnownColor(randomColorName);

12
从已知颜色枚举中获取一个随机值。 也许可以通过以下方式实现:
System.Array colorsArray = Enum.GetValues(typeof(KnownColor));
KnownColor[] allColors = new KnownColor[colorsArray.Length];

Array.Copy(colorsArray, allColors, colorsArray.Length);
// get a randon position from the allColors and print its name.

4
复制该数组是多余的。 - Konrad Rudolph
实际上,它只是从KnowColor中随机选择一个颜色,抱歉 :-) - Pih

7

忽略你想要的颜色 - 你实际上只需要一个可能值的列表,然后从该列表中随机选择一个值。

唯一棘手的部分是确定你想要的颜色集。正如Pih所提到的,有KnownColor - 或者您可以找出类型为Color的所有公共静态属性在Color结构中,并获取它们的名称。这取决于你想做什么。

请注意,随机本身可能有点棘手 - 如果您选择多个随机颜色,则可能需要使用单个Random`实例。不幸的是,它不是线程安全的,这使得事情可能更加复杂。请参阅我的关于随机性的文章以获取更多信息。


5
听起来你只需要从KnownColor枚举中获取一个随机颜色。

3
你可以尝试这个:对于.NET 4.5。
public Windows.UI.Color GetRandomColor()
{
            Random randonGen = new Random();
            Windows.UI.Color randomColor = 
                Windows.UI.Color.FromArgb(
                (byte)randonGen.Next(255), 
                (byte)randonGen.Next(255),
                (byte)randonGen.Next(255), 
                (byte)randonGen.Next(255));
            return randomColor;
}

1
-1:这个问题是要获取随机的颜色名称,而不是颜色。 - Oliver
如果您在循环内调用此方法,则会多次获得相同的颜色,因为每次都会实例化一个新的随机对象。在这种情况下,它将获得相同的种子,从而生成相同的“随机”值。 - Oliver

2
将颜色放入一个数组中,然后选择一个随机索引:
class RandomColorSelector
{
    static readonly Color[] Colors = 
        typeof(Color).GetProperties(BindingFlags.Public | BindingFlags.Static)
       .Select(propInfo => propInfo.GetValue(null, null))
       .Cast<Color>()
       .ToArray();

    static readonly string[] ColorNames =  
        typeof(Color).GetProperties(BindingFlags.Public | BindingFlags.Static)
        .Select(propInfo => propInfo.Name)
        .ToArray();

    private Random rand = new Random();

    static void Main(string[] args)
    {
        var colorSelector = new RandomColorSelector();
        var color = colorSelector.GetRandomColor();

        // in case you are only after the *name*
        var colorName = colorSelector.GetRandomColorName();            
    }

    public Color GetRandomColor()
    {
        return Colors[rand.Next(0, Colors.Length)];
    }

    public string GetRandomColorName()
    {
        return ColorNames[rand.Next(0, Colors.Length)];
    }
}

请注意,上面的示例仅查找Color类型的所有静态属性。您可能希望通过检查属性的实际返回类型是否为Color来改进此功能。

请注意,通常情况下,使用静态变量来生成随机数是不好的做法,因为它不是线程安全的。 - Jon Skeet

2

C#中获取颜色列表复制代码:

代码:

private List<string> GetColors()
{
    //create a generic list of strings
    List<string> colors = new List<string>();
    //get the color names from the Known color enum
    string[] colorNames = Enum.GetNames(typeof(KnownColor));
    //iterate thru each string in the colorNames array
    foreach (string colorName in colorNames)
    {
        //cast the colorName into a KnownColor
        KnownColor knownColor = (KnownColor)Enum.Parse(typeof(KnownColor), colorName);
        //check if the knownColor variable is a System color
        if (knownColor > KnownColor.Transparent)
        {
            //add it to our list
            colors.Add(colorName);
        }
    }
    //return the color list
    return colors;
}

+1 对于 > KnownColor.Transparent 的提示 - 在检查 PS> [enum]::GetValues([System.Drawing.KnownColor]) | % { "$($_): $([int]$_)" } 的输出后,我还需要添加 && knownColor < KnownColor.ButtonFace - mlhDev

1

我结合了这个线程中的一些答案,并提出了更通用的解决方案,用于生成随机KnownColor:

public class Enum<T> where T : struct, Enum
{
    public static T Random
    {
        get => GetRandom();
    }

    public static T SeededRandom(int seed)
    {
        return GetRandom(seed);
    }

    private static T GetRandom(int? seed = null)
    {
        var enumValues = Enum.GetValues<T>();
        Random r;
        if(seed.HasValue)
        {
            r = new Random(seed.Value);
        }
        else
        {
            r = new Random();
        }
        var randomIndex = r.Next(enumValues.Length - 1);
        return enumValues[randomIndex];
    }

}

那么你可以这样使用:

public Color GetRandomColor()
{
    var randomKnownColor = Enum<KnownColor>.Random;
    return Color.FromKnownColor(randomKnownColor);
}

你也可以使用SeededRandom(int seed)方法,这更适合我的用例。当我想根据某个Id分配随机颜色,并在重复过程中为相同的Id获取相同的颜色时。

适用于C# >= 7.3


1

0
为了澄清原问题中的语法错误,它应该是Color.FromRgb,以及。

(Byte)random2.Next(255)

将整数转换为Color所需的字节值:

    Random random2 = new Random();
    public int nn = 0x128;
    public int ff = 0x512;
    Color randomColor = Color.FromRgb((Byte)random2.Next(nn, ff), (Byte)random2.Next(nn, ff), (Byte)random2.Next(nn, ff));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接