如何在C#中生成随机的颜色名称
我需要生成随机的颜色名称,例如“红色”,“白色”等。我该怎么办? 我能够产生这样的随机颜色:
Random randonGen = new Random(); Color randomColor = Color.FromArgb(randonGen.Next(255), randonGen.Next(255), randonGen.Next(255));
但我需要的名字,并不是像这样产生的所有颜色都有一个已知的名字。
谢谢
使用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.
听起来就像只需要KnownColor枚举中的随机颜色。
忽略一个事实,即你在追逐颜色 – 你真的只是想要一个可能值的列表,然后从该列表中取一个随机值。
唯一棘手的问题就是确定你所使用的颜色。 正如Pih提到的那样,有KnownColor
– 或者你可以在Color
结构中findColor
types的所有公共静态属性,并获取它们的名字。 这取决于你想要做什么。
请注意,随机性本身可能有点尴尬 – 如果你select了多个随机颜色,你可能想要使用一个Random`实例。 不幸的是,它不是线程安全的,这使得事情变得更加复杂。 查看我的关于随机性的文章以获取更多信息。
或者你可以试试这个:.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; }
复制的代码从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; }
把颜色放入一个数组,然后select一个随机索引:
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
types的所有静态属性。 您可能希望通过检查属性的实际返回types是否为Color
来改善此情况。
我会build立一个查找表。 特别是因为一些颜色取决于个人的解释。
浏览Color结构( http://msdn.microsoft.com/en-us/library/system.drawing.color.aspx )中的每个颜色值,并将其映射到RGB值。 然后转换回来,查找RGB值,看它是否有一个命名的颜色。
没有办法随机化一个枚举,就像你想要做的那样,最合适的解决scheme将通过设置一个列表的所有颜色的值,然后获得一个整数随机化它并用它作为列表的索引。
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; }
在这里,我正在基于完成的configuration文件生成颜色。
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的答案; 然而,没有足够的业力。 任何人,我试图实现这一点,遇到了多个调用生成相同颜色的问题,因为代码被连续快速调用(即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); } ... }
生成一个随机数并将其转换为KnownColor Type
((KnownColor)Random.Next());
public 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; }