Consider a scenario where you want to retrieve a List
or IEnumerable
of the values of all the selected checkboxes in an <asp:CheckBoxList>
.
Here's the current implementation:
IEnumerable<int> allChecked = (from item in chkBoxList.Items.Cast<ListItem>()
where item.Selected
select int.Parse(item.Value));
Question: How would you improve this LINQ query using a lambda expression or lambda syntax?
You are using lambda expressions - they are just concealed by your use of C#'s query operators.
Consider that this:
IEnumerable<int> allChecked = (from item in chkBoxList.Items.Cast<ListItem>()
where item.Selected
select int.Parse(item.Value));
Gets compiled to this:
IEnumerable<int> allChecked = chkBoxList.Items.Cast<ListItem>()
.Where(i => i.Selected)
.Select(i => int.Parse(i.Value));
As you can see you are already using two lambda expressions (they are the parameters to the Where
and Select
methods) and you didn't even know it! This query is fine and I wouldn't change it at all.
I would improve the query expression by making the call to Cast<T>
implicit:
IEnumerable<int> allChecked = from ListItem item in chkBoxList.Items
where item.Selected
select int.Parse(item.Value);
When you specify the type of a range variable, the compiler inserts a call to Cast<T>
for you.
Other than that, I entirely agree with Andrew.
EDIT: For GONeale:
IEnumerable<int> allChecked = chkBoxList.Items
.Cast<ListItem>()
.Where(item => item.Selected)
.Select(item => int.Parse(item.Value));
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With