[英]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.