web-dev-qa-db-fra.com

Comment effectuer une requête LINQ sur Enum?

Ci-dessous est mon Enumerator List:

public enum StatusEnum
{
    Open = 1,
    Rejected = 2,
    Accepted = 3,
    Started = 4,
    Completed = 5,
    Cancelled = 6,
    Assigned = 7
}

J'ai besoin de le lier à un Combobox, mais n'affiche que quelques statuts spécifiques et ignore le reste.

C'est ce que j'ai jusqu'à présent:

public static List<Activity.StatusEnum> StatusList()
{
        IEnumerable<Activity.StatusEnum> query = Enum.GetValues(typeof(Activity.StatusEnum)).Cast<Activity.StatusEnum>()
                        .Where(x => x == Activity.StatusEnum.Open
                            || x == Activity.StatusEnum.Rejected
                            || x == Activity.StatusEnum.Accepted
                            || x == Activity.StatusEnum.Started);
        return query.ToList();
}

Cependant, je pense que le code est peu compliqué et n'est pas une approche correcte pour lier la liste filtrée Enum à un Combobox. Quelqu'un peut-il suggérer une façon plus robuste de procéder?

Mise à jour

Je devrais peut-être changer l'ordre de sélection. J'ai donc besoin d'une solution générique qui n'obtient pas seulement le premier nombre X de statuts.

28
Learner

Eh bien, si vous allez coder en dur les éléments qui devraient être de toute façon dans la liste, pourquoi ne pas simplement faire ceci:

public static List<Activity.StatusEnum> StatusList()
{
    return new List<Activity.StatusEnum>
    { 
        Activity.StatusEnum.Open, 
        Activity.StatusEnum.Rejected, 
        Activity.StatusEnum.Accepted, 
        Activity.StatusEnum.Started 
    };
}

Vous pouvez également disposer du List<T> et renvoie simplement le tableau lui-même. Tant que vous savez que ce sont les articles que vous voulez, alors il n'y a pas besoin de Linq.

11
p.s.w.g
return Enum.GetValues(typeof(Activity.StatusEnum)).Cast<Activity.StatusEnum>().Where((n, x) => x < 4);

Si vous souhaitez pouvoir modifier la liste des éléments, ajoutez-les simplement dans un List<Activity.StatusEnum> et utilisez Contains:

var listValid = new List<Activity.StatusEnum>() { Activity.StatusEnum.Open, Activity.StatusEnum.Rejected, Activity.StatusEnum.Accepted, Activity.StatusEnum.Started };
return Enum.GetValues(typeof(Activity.StatusEnum)).Cast<Activity.StatusEnum>().Where(n => listValid.Contains(n));
38
It'sNotALie.

Étapes:

  • Obtenez les valeurs enum et convertissez les résultats en type de enum
  • Trier les valeurs enum par leurs valeurs entières (sinon elles sont triées naturellement par une amplitude non signée)
  • Prenez les 4 premiers

Code:

return Enum.GetValues(typeof(Activity.StatusEnum))
.Cast<Activity.StatusEnum>()
.OrderBy(se =>(int)se)
.Take(4);

Sortie:

Ouvert Rejeté Accepté Démarré

7
Stephen Kennedy

Tout d'abord, si possible, je ferais de votre énumération des pouvoirs de 2, afin qu'ils puissent être OU ensemble.

public enum StatusEnum
{
    Open = 1,
    Rejected = 2,
    Accepted = 4,
    Started = 8,
    Completed = 16,
    Cancelled = 32,
    Assigned = 64
}

Ensuite, vous pouvez faire quelque chose comme ceci:

public static List<Activity.StatusEnum> StatusList()
{
    var statusesToShow = Activity.StatusEnum.Open | Activity.StatusEnum.Rejected | Activity.StatusEnum.Accepted | Activity.StatusEnum.Started;

    return Enum
        .GetValues(typeof(Activity.StatusEnum))
        .Cast<Activity.StatusEnum>()
        .Where(x => (x & statusesToShow) == x)
        .ToList();
}

EDIT : Étant donné que vous ne pouvez pas modifier les valeurs d'énumération, je vous recommande simplement d'utiliser quelque chose comme:

public static List<Activity.StatusEnum> StatusList()
{
    return new List<Activity.StatusEnum> {
        Activity.StatusEnum.Open, 
        Activity.StatusEnum.Rejected, 
        Activity.StatusEnum.Accepted, 
        Activity.StatusEnum.Started
    };
}
6
Chris Doggett

"... ne montrez que les 4 premiers statuts et ignorez le reste."

Pour obtenir les premiers n éléments d'un IEnumerable<T>, utilisez la méthode Take:

return Enum.GetValues(typeof(Activity.StatusEnum))
    .Cast<Activity.StatusEnum>()
    .Take(4)
    .ToList();
5
Timothy Shields

Que diriez-vous de quelque chose comme:

.Where(x => x <= Activity.StatusEnum.Started)
3
John Bustos