web-dev-qa-db-fra.com

LINQ: obtenir toutes les valeurs sélectionnées d'un CheckBoxList à l'aide d'une expression Lambda

Considérez un scénario dans lequel vous souhaitez récupérer un List ou IEnumerable des valeurs de toutes les cases à cocher sélectionnées dans un <asp:CheckBoxList>.

Voici l'implémentation actuelle:

IEnumerable<int> allChecked = (from item in chkBoxList.Items.Cast<ListItem>() 
                               where item.Selected 
                               select int.Parse(item.Value));

Question: Comment amélioreriez-vous cette requête LINQ en utilisant une expression lambda ou une syntaxe lambda?

36
p.campbell

Vous êtes en utilisant des expressions lambda - elles sont juste cachées par votre utilisation des opérateurs de requête de C #.

Considérez que ceci:

IEnumerable<int> allChecked = (from item in chkBoxList.Items.Cast<ListItem>() 
                               where item.Selected 
                               select int.Parse(item.Value));

Obtient compilé à ceci:

IEnumerable<int> allChecked = chkBoxList.Items.Cast<ListItem>()
                              .Where(i => i.Selected)
                              .Select(i => int.Parse(i.Value));

Comme vous pouvez le voir, vous utilisez déjà deux expressions lambda (ce sont les paramètres des méthodes Where et Select) et vous ne le saviez même pas! Cette requête est très bien et je ne la changerais pas du tout.

87
Andrew Hare

Je voudrais améliorer l'expression de la requête en faisant l'appel à Cast<T> implicite:

IEnumerable<int> allChecked = from ListItem item in chkBoxList.Items 
                              where item.Selected 
                              select int.Parse(item.Value);

Lorsque vous spécifiez le type d'une variable de plage, le compilateur insère un appel à Cast<T> pour vous.

A part ça, je suis entièrement d'accord avec Andrew.

EDIT: Pour GONeale:

IEnumerable<int> allChecked = chkBoxList.Items
                                        .Cast<ListItem>()
                                        .Where(item => item.Selected)
                                        .Select(item => int.Parse(item.Value));
22
Jon Skeet