36 votes

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?

87voto

Andrew Hare Points 159332

Vous utilisez des expressions lambda - ils sont juste cachés 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.

22voto

Jon Skeet Points 692016

J'améliorerais 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 pour vous un appel à Cast<T> .

À part cela, 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));
 

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