webentwicklung-frage-antwort-db.com.de

So generieren Sie zufällige Farbnamen in C #

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

46
user579674

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);
81
Konrad Rudolph

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.
11
Pih

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.

6
Jon Skeet

Klingt so, als ob Sie nur eine zufällige Farbe aus der KnownColor Enumeration benötigen.

5
David

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.

2
Dirk Vollmar

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;
}
2
Javed Akram

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;
}
2
Vivek Saurav

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.

1
Max

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.

0
Amedio

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");
}
0
T Gupta

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));
0
pollaris

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);
    }
    ...
}
0
S. Arseneau
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;
        }
0
jon