我试图理解这段代码:
List<string> selectedValues = CheckBoxList1.Items.Cast<ListItem>()
.Where(li => li.Selected)
.Select(li => li.Value)
.ToList();
根据我的研究,我理解了 Lambda 函数的意义(提供一个可以用作内联参数的函数),但为什么
在这种情况下使用它?若要仅将项目添加到 li。Selected 的值,并且仅将这些选定项的值添加到名为"selectedValues"的列表中?如果是这种情况,难道没有其他更易读的方法吗?不然怎么写呢?我的理解正确吗?
谢谢你的时间。
有问题的代码块执行以下操作:
- 获取
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);
}
}
您确实正确阅读了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);
}
}
}
你的代码非常能表达它应该做什么或做什么。
Lambda 表达式只是一个指向匿名方法的委托,该方法具有主体,但没有可以调用的名称。
当我们写以下内容时:
CheckBoxList1.Items.Cast<ListItem>().Where(x => x.Selected)
编译器将生成如下所示的方法:
internal bool <M>b__0_0(ListItem x)
{
return x.Selected;
}
以及用于保存对该方法的引用的委托类型:
public static Func<ListItem, bool> <>9__0_0;
并将为集合中的每个项调用该方法。
我们可以重写代码而不使用 lambda 表达式来理解,例如:
public bool IsSelectedWhere(ListItem item)
{
return item.Selected;
}
public object SelectValue(ListItem item)
{
return item.Value;
}
我们可以这样称呼:
CheckBoxList1.Items.Cast<ListItem>().Where(IsSelectedWhere)
.Select(SelectValue)
.ToList();
lambda 表达式的好处是我们不需要在代码中定义方法,我们只需将它们编写为表达式,编译器负责生成方法并使用 Func<T>
调用它。
希望它在一定程度上有所帮助。