41 votes

Le moyen le plus efficace d'analyser une énumération signalée dans une liste

J'ai une énumération signalée et j'ai besoin de récupérer les noms de toutes les valeurs qui y sont définies.

Je profite actuellement de la méthode ToString() de l'énumération qui renvoie les éléments séparés par des virgules.

 public void SetRoles(Enums.Roles role)
{
    IList<Entities.Role> roleList = role.ToString("G").Split(',')
        .Select(r => new Entities.Role(r.Trim()))
        .ToList();
    ...
}

Je suis sûr qu'il doit y avoir un meilleur moyen que celui-ci.

42voto

Grzenio Points 16802

Essaye ça:

 public void SetRoles(Enums.Roles role)
{
  List<string> result = new List<string>();
  foreach(Roles r in Enum.GetValues(typeof(Roles)))
  {
    if ((role & r) != 0) result.Add(r.ToString());
  }
}

28voto

Mick Bruno Points 184

Si vous ne voulez vraiment que les chaînes, rien de plus simple que : string[] flags = role.ToString().Split(','); C'est plus simple que d'utiliser LINQ et il ne s'agit toujours que d'une seule ligne de code. Ou si vous voulez une liste au lieu d'un tableau comme dans l'exemple de la question, vous pouvez convertir le tableau en liste : List<string> flags = new List<string>(role.ToString().Split(',')); Dans mon cas, j'avais besoin d'une solution générique et j'ai trouvé ceci: value.ToString().Split(',').Select(flag => (T)Enum.Parse(typeof(T), flag)).ToList();

6voto

Alex Paven Points 3755

Enum.Parse gérera très bien les valeurs concaténées générées par ToString. Preuve à l'aide de la fenêtre Immédiat :

 ? System.Enum.Parse(typeof(System.AttributeTargets), "Class, Enum")
Class | Enum

(la deuxième ligne est la sortie, qui est différente dans le débogueur/fenêtre immédiate de la sortie générique Enum.ToString()).

1voto

Darin Dimitrov Points 528142

Pourquoi avez-vous besoin d'une liste? Tout est déjà stocké dans les drapeaux :

 [Flags]
enum Roles
{
    Read = 0x1,
    Write = 0x2,
    Delete = 0x4,
}

Attribuez ensuite les rôles :

 var roles = Roles.Read | Roles.Write;

Et chaque fois que vous devez vérifier si un rôle donné a été, vous n'avez pas besoin de regarder dans une liste, mais simplement de regarder dans l'énumération des rôles :

 if ((roles & Roles.Read) == Roles.Read)
{
    // The user has read permission
}
if ((roles & Roles.Write) == Roles.Write)
{
    // The user has write permission
}

1voto

List<string> GetRoleNames(Roles roles) =>
    Enum.GetValues(typeof(Roles))
        .Cast<Roles>()
        .Where(role => roles.HasFlag(role))
        .Select(role => role.ToString())
        .ToList();

void TestRoleSelection()
{
    var selectedRoles = (Roles)6;
    var roleNames = GetRoleNames(selectedRoles);
    Console.WriteLine(string.Join(",", roleNames));
    // Output: Admin,User
}

[Flags]
enum Roles
{
    SuperAdmin = 1,
    Admin = 2,
    User = 4,
    Anonymous = 8
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X