Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

LINQ: Get all selected values of a CheckBoxList using a Lambda expression

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?

like image 808
p.campbell Avatar asked Jul 28 '09 18:07

p.campbell


2 Answers

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.

like image 127
Andrew Hare Avatar answered Oct 27 '22 13:10

Andrew Hare


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));
like image 23
Jon Skeet Avatar answered Oct 27 '22 11:10

Jon Skeet