簡體   English   中英

C#中如何生成隨機顏色名稱

[英]How to generate random color names in C#

我需要生成隨機顏色名稱,例如“紅色”、“白色”等。我該怎么做? 我能夠像這樣生成隨機顏色:

Random randonGen = new Random();
Color randomColor = Color.FromArgb(randonGen.Next(255), randonGen.Next(255), 
randonGen.Next(255));

但我需要這些名稱,並不是像這樣生成的所有 colors 都有一個已知名稱。

謝謝

使用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);

取一個隨機值並從 KnownColor 枚舉中獲取。

可以這樣:

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.

忽略您在 colors 之后的事實-您實際上只需要一個可能值的列表,然后從該列表中獲取一個隨機值。

唯一棘手的一點是確定您要使用哪一組 colors。 正如 Pih 提到的,有KnownColor - 或者您可以在Color結構中找到Color類型的所有公共 static 屬性,並獲取它們的名稱。 這取決於你想要做什么。

請注意,隨機性本身可能有點尷尬 - 如果您選擇多個隨機 colors,您可能想要使用 Random 的單個實例。 不幸的是,它不是線程安全的,這可能使事情變得更加復雜。 有關更多信息,請參閱我關於隨機性的文章

聽起來您只需要來自KnownColor枚舉的隨機顏色。

或者你可以試試這個:對於 .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;
}

將 colors 放入一個數組中,然后選擇一個隨機索引:

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類型的所有 static 屬性。 您可能希望通過檢查屬性的實際返回類型是否為Color來改進這一點。

Retrieve a list of colors in 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;
}

我會建立一個查找表。 特別是因為一些 colors 取決於個人解釋。

Go 通過 Color 結構中的每個顏色值 ( http://msdn.microsoft.com/en-us/library/system.drawing.color.aspx ) 和 Z1D78DC8ED51214E518B5114FE24 到它的 AERGB 值。 然后要轉換回來,查找 RGB 值以查看它是否具有命名顏色。

我結合了這個線程中的一些答案,並提出了更通用的解決方案來生成隨機的 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

private string getRandColor()
        {
            Random rnd = new Random();
            string hexOutput = String.Format("{0:X}", rnd.Next(0, 0xFFFFFF));
            while (hexOutput.Length < 6)
                hexOutput = "0" + hexOutput;
            return "#" + hexOutput;
        }

在這里,我根據完成的配置文件生成 colors。

public string generateColour(Decimal percentProfileComplete )
{
    if(percent < 50)
    { 
        return "#" + (0xff0000 | Convert.ToInt32(Convert.ToDouble(percentProfileComplete ) * 5.1) * 256).ToString("X6");
    }
    return "#" + (0xff00 | (255 - Convert.ToInt32((Convert.ToDouble(percentProfileComplete ) - 50) * 5.1)) * 256 * 256).ToString("X6");
}

我會評論 Pih 的回答; 但是,業力不夠。 Anywho,我嘗試實現這一點並遇到了多次調用生成相同顏色的問題,因為代碼被快速連續地重復調用(即 randomGen 是相同的,因為它基於時鍾 = 隨之而來的結果相同)。

試試這個:

public class cExample
{
    ...
    Random randomGen = new Random();
    KnownColor[] names = (KnownColor[]) Enum.GetValues(typeof(KnownColor));
    ...
    private Color get_random_color()
    {
         KnownColor randomColorName = names[randomGen.Next(names.Length)];
         return Color.FromKnownColor(randomColorName);
    }
    ...
}

為了清除原始問題中的語法錯誤,它是

Color.FromRgb 和

(字節)random2.Next(255)

將 integer 轉換為 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));

沒有辦法隨機化枚舉,就像你想做的那樣,最合適的解決方案是通過設置一個包含 colors 的所有值的列表,然后獲得一個 integer 隨機化它並將其用作列表的索引。

如果您想從特定的 colors 列表中獲取隨機顏色
然后試試下面一個

Color[] colors = new[] { Color.Red, Color.Blue, Color.FromArgb(128, 128, 255) };    //Add your favorite colors list
Random randonGen = new Random();
Color randomColor = colors[Generator.Next(0, colors.Length)];    //It will choose random color from "colors" array

生成一個隨機數並將其轉換為 KnownColor 類型

((KnownColor)Random.Next());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM