Ich muss zufällige Farbnamen erzeugen, z. "Rot", "Weiß" usw. Wie kann ich das tun? Ich kann zufällige Farben wie folgt erzeugen:
Random randonGen = new Random();
Color randomColor = Color.FromArgb(randonGen.Next(255), randonGen.Next(255),
randonGen.Next(255));
aber ich brauche die Namen und nicht alle so erzeugten Farben haben einen bekannten Namen.
Vielen Dank
Verwenden Sie Enum.GetValue
, um die Werte der KnownColor
-Enumeration abzurufen und einen zufälligen Wert abzurufen:
Random randomGen = new Random();
KnownColor[] names = (KnownColor[]) Enum.GetValues(typeof(KnownColor));
KnownColor randomColorName = names[randomGen.Next(names.Length)];
Color randomColor = Color.FromKnownColor(randomColorName);
Nehmen Sie einen zufälligen Wert und erhalten Sie von KnownColor eine Aufzählung.
Kann so sein:
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.
Ignorieren Sie die Tatsache, dass Sie nach Farben suchen - Sie möchten nur eine Liste möglicher Werte und nehmen dann einen zufälligen Wert aus dieser Liste.
Der einzige knifflige Teil ist dann herauszufinden, welche Farben Sie suchen. Wie bereits erwähnt, gibt es KnownColor
- oder Sie können alle öffentlichen statischen Eigenschaften des Typs Color
in der Color
-Struktur herausfinden und deren Namen abrufen. Es hängt davon ab, was Sie zu tun versuchen.
Beachten Sie, dass die Zufälligkeit selbst etwas umständlich sein kann - wenn Sie mehrere zufällige Farben auswählen, möchten Sie wahrscheinlich eine einzelne Instanz von Random` verwenden. Leider ist es nicht fadensicher, was die Dinge möglicherweise noch komplizierter macht. In meinem Artikel über Zufälligkeit finden Sie weitere Informationen.
Klingt so, als ob Sie nur eine zufällige Farbe aus der KnownColor Enumeration benötigen.
Legen Sie die Farben in ein Array und wählen Sie einen zufälligen Index:
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)];
}
}
Beachten Sie, dass im obigen Beispiel einfach alle statischen Eigenschaften des Typs Color
nachgeschlagen werden. Möglicherweise möchten Sie dies verbessern, indem Sie prüfen, ob der tatsächliche Rückgabetyp der Eigenschaft eine Color
ist.
Kopierter Code aus Abrufen einer Liste von Farben in C #
CODE:
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;
}
Oder Sie könnten es ausprobieren: Für .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;
}
Ich würde eine Nachschlagetabelle bauen. Zumal einige Farben der persönlichen Interpretation unterliegen.
Durchlaufen Sie jeden Farbwert in der Farbstruktur ( http://msdn.Microsoft.com/de-de/library/system.drawing.color.aspx ) und ordnen Sie ihn den RGB-Werten zu. Um dann zurück zu konvertieren, suchen Sie nach dem RGB-Wert, um zu sehen, ob er eine benannte Farbe hat.
Es gibt keine Möglichkeit, eine Aufzählung nach dem Zufallsprinzip zu randomisieren. Die am besten geeignete Lösung würde passieren, indem Sie eine Liste mit allen Werten der Farben setzen. Dann erhalten Sie eine Ganzzahl, die zufällig angeordnet ist, und sie als Index der Liste verwenden.
Hier generiere ich Farben basierend auf dem vervollständigten Profil.
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");
}
Um die Syntaxfehler in der ursprünglichen Frage zu klären, ist es
Color.FromRgb und
(Byte) random2.Next (255)
konvertiert die Ganzzahl in einen Bytewert, der von Color benötigt wird:
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));
Ich hätte Pihs Antwort kommentiert; jedoch nicht genug Karma. Wie auch immer, ich habe versucht, dies zu implementieren, und versuchte, die gleiche Farbe aus mehreren Aufrufen zu erzeugen, da der Code wiederholt in schneller Folge aufgerufen wurde (d. H. Der randomGen war derselbe und da er auf der Uhr basiert.
Versuchen Sie es stattdessen:
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);
}
...
}
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;
}