p.campbell
p.campbell

Reputation: 100557

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?

Upvotes: 36

Views: 40545

Answers (2)

Jon Skeet
Jon Skeet

Reputation: 1499740

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

Upvotes: 23

Andrew Hare
Andrew Hare

Reputation: 351466

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.

Upvotes: 90

Related Questions