Come generare nomi di colors casuali in C #

Devo generare nomi di colors casuali, ad esempio “Rosso”, “Bianco” ecc. Come posso farlo? Sono in grado di generare un colore casuale come questo:

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

ma ho bisogno dei nomi e non tutti i colors generati in questo modo hanno un nome conosciuto.

Grazie

Utilizzare Enum.GetValue per recuperare i valori dell’enumerazione KnownColor e ottenere un valore casuale:

 Random randomGen = new Random(); KnownColor[] names = (KnownColor[]) Enum.GetValues(typeof(KnownColor)); KnownColor randomColorName = names[randomGen.Next(names.Length)]; Color randomColor = Color.FromKnownColor(randomColorName); 

Prendi un valore casuale e ottieni da KnownColor enum.

Può essere così:

 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. 

Ignora il fatto che cerchi i colors: vuoi solo un elenco di valori possibili e poi prendere un valore casuale da quella lista.

L’unica cosa difficile è capire quale set di colors cerchi. Come menzionato da Pih, c’è KnownColor – oppure puoi scoprire tutte le proprietà statiche pubbliche di tipo Color all’interno della struttura Color , e ottenere i loro nomi. Dipende da cosa stai cercando di fare.

Nota che la casualità in sé può essere un po ‘imbarazzante: se stai selezionando più colors casuali, probabilmente vorrai usare una singola istanza di Random`. Sfortunatamente non è thread-safe, il che rende le cose potenzialmente ancora più complicate. Vedi il mio articolo sulla casualità per maggiori informazioni.

Sembra che tu abbia solo bisogno di un colore casuale dall’enumerazione di KnownColor .

Codice copiato da Recupera un elenco di colors in C #

CODICE:

 private List GetColors() { //create a generic list of strings List colors = new List(); //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; } 

Metti i colors in una matrice e poi scegli un indice casuale:

 class RandomColorSelector { static readonly Color[] Colors = typeof(Color).GetProperties(BindingFlags.Public | BindingFlags.Static) .Select(propInfo => propInfo.GetValue(null, null)) .Cast() .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)]; } } 

Si noti che l’esempio sopra mostra semplicemente tutte le proprietà statiche del tipo di Color . Potresti voler migliorare questo verificando che il tipo di ritorno effettivo della proprietà sia un Color .

O potresti provare questo: per .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; } 

Vorrei build una tabella di ricerca. Soprattutto perché alcuni colors sono all’altezza dell’interpretazione personale.

Passare attraverso ogni valore di colore nella struttura Color ( http://msdn.microsoft.com/en-us/library/system.drawing.color.aspx ) e mapparlo ai valori RGB. Quindi per riconvertire, cercare il valore RGB per vedere se ha un colore con nome.

Non c’è modo di Randomizzare un’Enumerazione, come si vuole fare, la soluzione più adatta passerebbe impostando una Lista con tutti i valori dei colors, quindi ottenere un intero che la randomizza e usarla come indice della lista.

 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; } 

Qui, sto generando i colors in base al profilo completato.

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

Avrei commentato la risposta di Pih; tuttavia, non abbastanza karma. Anywho, ho provato a implementarlo e mi sono imbattuto nel problema dello stesso colore generato da più chiamate poiché il codice veniva chiamato ripetutamente in rapida successione (cioè il randomGen era lo stesso e dal momento che si basa sull’orologio = seguivano gli stessi risultati).

Prova questo invece:

 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); } ... } 

Per chiarire gli errori di syntax nella domanda originale, lo è

Color.FromRgb e

(Byte) random2.Next (255)

converte il numero intero in un valore byte richiesto da Colore:

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

generare un numero casuale e lanciarlo su KnownColor Type

 ((KnownColor)Random.Next());