Nous avons vu la dernière fois comment utiliser les Enums à choix multiples. En partant du même principe qui consiste à étendre les Enum par des extensions methods, je vous propose aujourd’hui d’ajouter une méthode random. En effet, cela peut être utile parfois sur certains types de listes mais aussi dans un contexte de tests, si vous voulez injecter beaucoups d’objets avec des paramètres enums qui changent un peu, avoir un petit random automatique peut être pratique…

/// 
/// Get a random value on an enum list type
/// 
/// the enum type
/// the enum to extend
/// an enum value
public static T Random(this Enum en)
{
    string[] names = Enum.GetNames(typeof(T));
    Random r = new Random(DateTime.Now.Millisecond);
    return (T)Enum.Parse(typeof(T), names[r.Next(names.Count())]);
}

Dans la foulée, je rajouterai un convertisseur Enum-> List:

/// 
/// convert an enum to a list of enum values
/// 
/// the type of the enumeration
/// the type to extend
/// a list of unitary values
public static List ToEnumList(this Enum e)
{
    string[] temp = Enum.GetNames(typeof(T));
    List result = new List();
    foreach (string a in temp)
    {
        result.Add((T)Enum.Parse(typeof(T), a));
    }
    return result;
}

Une petite console pour tester tout ça:

class Program
{
    static void Main(string[] args)
    {
        Dictionaryint> FruitCounter = new Dictionaryint>();
        
        foreach (Fruits f in new Fruits().ToEnumList())
        {
            FruitCounter.Add(f, 0);
        }
        for (int i = 0; i < 1000; i++)
        {
            FruitCounter[new Fruits().Random()]++;

        }
        foreach (string f in Enum.GetNames(typeof(Fruits)))
        {
            Console.WriteLine("[{0}] : {1}", f, FruitCounter[(Fruits)Enum.Parse(typeof(Fruits), f)]);
        }
        
        Console.Read();
    }
}

Et voici le résultat:


C’est pas grand chose, mais c’est fou ce que c’est pratique ;-)