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?
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.
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.
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));
Étapes:
enum
et convertissez les résultats en type de enum
enum
par leurs valeurs entières (sinon elles sont triées naturellement par une amplitude non signée)Code:
return Enum.GetValues(typeof(Activity.StatusEnum))
.Cast<Activity.StatusEnum>()
.OrderBy(se =>(int)se)
.Take(4);
Sortie:
Ouvert Rejeté Accepté Démarré
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
};
}
"... 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();
Que diriez-vous de quelque chose comme:
.Where(x => x <= Activity.StatusEnum.Started)