10
votes

Comment utiliser LINQ contient () pour trouver une liste d'énums?

J'ai une énumite appelée orderstatus , et contient diverses statuts qu'un ordre peut être dans:

  • créé
  • en attente
  • attendre
  • valide
  • actif
  • traité
  • terminé

    Ce que je veux faire est de créer une instruction LINQ qui me dira si l'orderstaus est valide, actif, traité ou terminé.

    À l'heure actuelle, j'ai quelque chose comme: xxx

    qui fonctionne, mais c'est très "Wordy". Existe-t-il un moyen de convertir cela en un contenant () instruction et raccourcissez-le un peu?


0 commentaires

5 Réponses :


0
votes

Abumnig que l'ENUM est défini dans l'ordre que vous avez spécifié dans la question, vous pouvez raccourcir cela en utilisant une comparaison entière.

var result = 
  Order.Status.Where(x => 
    (int)x >= (int)OrderStatus.Valid &
    & (int)x <= (int)OrderStatus.Completed);


3 commentaires

Bonne réponse pour le moment, mais cela peut devenir plus fragile plus tard. Compréhension que ce code nécessiterait de vérifier l'ENUM de connaître tous les codes qui tombent dans la plage définie et que le développement doit toujours être capable de définir une plage continue contenant exactement les codes souhaités (si une constante expédiée a été placée entre le traitement et achevé que le L'utilisateur ne voulait pas dans leurs résultats, ce code se casse).


@Keiths, oui, j'ai couvert que dans le dernier paragraphe de ma réponse.


Yup, accepté, un peu trop flakeux pour ma demande, mais j'aime vraiment comment vous l'avez fait, car cela rend le code un peu plus flexible. Nous pourrions facilement ajouter un nouveau statut sans casser le code par exemple.



18
votes

Bien sûr:

var status in Order.Status.Where(status => 
    status.OrderCode.In(
        OrderStatus.Valid, 
        OrderStatus.Active, 
        OrderStatus.Processed,
        OrderStatus.Completed));


0 commentaires

3
votes

J'ai utilisé cette extension: xxx

Vous pouvez l'utiliser comme condition: xxx


3 commentaires

+1 pour la méthode d'extension! J'espère le refroidir pour utiliser Linq à l'intérieur aussi.


Oui, j'ai toujours voulu le faire mais j'ai oublié :)


Oui, bonne idée. Je pourrais utiliser quelque chose comme ça aussi, assez cool



0
votes

Vous pouvez les mettre dans une collection et utiliser: xxx


0 commentaires

1
votes

Si cet ensemble de statuts a une signification, par exemple, ce sont des statuts pour les commandes acceptées, vous pouvez définir une méthode d'extension sur votre enum et utiliser cela dans votre requête LINQ.

public static class OrderStatusExtensions
{
    public static bool IsAccepted(this OrderStatuses status)
    {
        return status == OrderStatuses.Valid
            || status == OrderStatuses.Active
            || status == OrderStatuses.Processed
            || status == OrderStatuses.Completed;
    }
}

var acceptedOrders = from o in orders
                     where o.Status.IsAccepted()
                     select o;


0 commentaires