web-dev-qa-db-ja.com

LINQ:Lambda式を使用して、CheckBoxListのすべての選択された値を取得する

<asp:CheckBoxList>で選択されたすべてのチェックボックスの値のListまたはIEnumerableを取得するシナリオを考えます。

これが現在の実装です:

IEnumerable<int> allChecked = (from item in chkBoxList.Items.Cast<ListItem>() 
                               where item.Selected 
                               select int.Parse(item.Value));

質問:ラムダ式またはラムダ構文を使用して、このLINQクエリをどのように改善しますか?

36
p.campbell

あなたはラムダ式を使用していますある-それらはC#のクエリ演算子の使用によって単に隠されています。

これを考慮してください:

IEnumerable<int> allChecked = (from item in chkBoxList.Items.Cast<ListItem>() 
                               where item.Selected 
                               select int.Parse(item.Value));

これにコンパイルされます:

IEnumerable<int> allChecked = chkBoxList.Items.Cast<ListItem>()
                              .Where(i => i.Selected)
                              .Select(i => int.Parse(i.Value));

ご覧のとおり、すでに2つのラムダ式(これらはWhereおよびSelectメソッドへのパラメーターです)を使用しており、知らないほどです。このクエリは問題なく、まったく変更しません。

87
Andrew Hare

Cast<T>を暗黙的に呼び出すことにより、クエリ式を改善します。

IEnumerable<int> allChecked = from ListItem item in chkBoxList.Items 
                              where item.Selected 
                              select int.Parse(item.Value);

範囲変数のタイプを指定すると、コンパイラーはCast<T>への呼び出しを挿入します。

それ以外は、Andrewに完全に同意します。

編集:Gonealeの場合:

IEnumerable<int> allChecked = chkBoxList.Items
                                        .Cast<ListItem>()
                                        .Where(item => item.Selected)
                                        .Select(item => int.Parse(item.Value));
22
Jon Skeet