如何翻译此 C# 示例中的 Lambda 运算符函数



我试图理解这段代码:

List<string> selectedValues = CheckBoxList1.Items.Cast<ListItem>()
    .Where(li => li.Selected)
    .Select(li => li.Value)
    .ToList();

根据我的研究,我理解了 Lambda 函数的意义(提供一个可以用作内联参数的函数),但为什么

在这种情况下使用它?

若要仅将项目添加到 li。Selected 的值,并且仅将这些选定项的值添加到名为"selectedValues"的列表中?如果是这种情况,难道没有其他更易读的方法吗?不然怎么写呢?我的理解正确吗?

谢谢你的时间。

有问题的代码块执行以下操作:

  1. 获取CheckBox1.Items中的所有项目
  2. 将它们转换为ListItem的类型
  3. 仅筛选选定的项目
  4. 选择那些现已筛选的项目的值。
  5. 将结果强制转换为列表。

您还可以按如下方式编写代码:

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> 调用它。

希望它在一定程度上有所帮助。

最新更新