我正在尝试理解以下代码块:
List<string> selectedValues = CheckBoxList1.Items.Cast<ListItem>()
.Where(li => li.Selected)
.Select(li => li.Value)
.ToList();
从我的研究中,我了解了Lambda函数的意义(提供了可以用作在线参数的函数),但是为什么在这种情况下要使用它呢?
仅将项添加到li.Selected的selectedValues中,并且仅将这些选择项的值添加到名为selectedValues的列表中?如果是这样,还有其他更易读的方式吗?这怎么写呢?我的理解正确吗?
感谢您的时间。
答案 0 :(得分:4)
问题中的代码块执行以下操作:
CheckBox1.Items
中的所有物品ListItem
您还可以编写如下代码:
List<string> selectedValues = new List<string>();
foreach (object item in CheckBoxList1.Items) {
var listItem = (ListItem)item;
if (listItem.Selected) {
selectedValues.Add(listItem.Value);
}
}
答案 1 :(得分:3)
您确实正确阅读了lambda。如果您将lambda视为逐步执行,则更容易获得。对我来说,它们更具可读性,而且都连贯一致。它们始终遵循相同的结构,而有许多方法可以编写相同的东西,此示例的lambda将始终相同。
另一种编写方式(请注意,这里我编写了lambda实际验证的所有内容):
List<string> selectedValues = new List<string>();
for(int i = 0; i < CheckBoxList1.Items.Count(); i++)
{
ListItem item = CheckBoxList1.Items[i] as ListItem;
if(item != null)
{
if(item.Selected == true)
{
selectedValues.Add(item.Value);
}
}
}
答案 2 :(得分:1)
您的代码表达了它应该做什么或该做什么。
Lambda表达式只是一个指向匿名方法的委托,该方法具有主体,但没有名称可用来调用它。
当我们写以下内容时:
console.log("We won won won no-won won-with-hyphen".match(/(?<!-)\b(won)\b(?!-)/g))
编译器将生成如下方法:
CheckBoxList1.Items.Cast<ListItem>().Where(x => x.Selected)
和代表该方法的引用的委托类型:
internal bool <M>b__0_0(ListItem x)
{
return x.Selected;
}
并将为集合中的每个项目调用方法。
我们无需使用lambda表达式就可以重写代码,例如:
public static Func<ListItem, bool> <>9__0_0;
我们可以这样打电话:
public bool IsSelectedWhere(ListItem item)
{
return item.Selected;
}
public object SelectValue(ListItem item)
{
return item.Value;
}
lambda表达式的好处是我们不需要在代码中定义方法,而只是将它们编写为表达式,而编译器将负责生成方法并使用 CheckBoxList1.Items.Cast<ListItem>().Where(IsSelectedWhere)
.Select(SelectValue)
.ToList();
进行调用。
希望它会有所帮助。