[英]How can I translate the Lambda operator functions in this C# example?
我试图理解这段代码:
List<string> selectedValues = CheckBoxList1.Items.Cast<ListItem>()
.Where(li => li.Selected)
.Select(li => li.Value)
.ToList();
从我的研究中,我理解 Lambda 函数的意义(提供一个可以用作内嵌参数的函数),但为什么在这种情况下使用它?
仅将项目添加到 li.Selected 的 selectedValues,并且仅将这些选定项目的值添加到名为 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>
调用它。
希望它在某种程度上有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.