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?
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.
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));