对列表c#中的特定索引应用lambda表达式

本文关键字:索引 应用 lambda 表达式 列表 | 更新日期: 2023-09-27 18:26:24

我是lambda表达式的新手,在将代码中涉及循环内列表索引的部分转换为等效lambda表达式时遇到问题。

示例1:在一个列表中使用不同的索引

List<double> newList = new List<double>();
for (int i = 0; i < list.Count - 1; ++i)
{
     newList.Add(list[i] / list[i + 1]);
}

示例2:使用两个列表中的索引

double result = 0;
for (int i = 0; i < list1.Count; ++i)
{
    result += f(list1[i]) * g(list2[i]);
}

如何编写等效的lambda表达式?

对列表c#中的特定索引应用lambda表达式

lambda表达式看起来像{params} => {body},其中特征符号是=>"映射到"。您所要求的通常被称为LINQ查询表达式,有两种样式:

  • 查询的函数样式通常是对LINQ扩展方法(如SelectWhereTakeToList)的一系列链式调用。这是我在下面的例子中使用的风格,也是(根据我的经验)更流行的风格。

  • "语言集成"样式(*)使用内置的C#关键字,编译器会将其转换为函数样式。例如:

    var query = from employee in employeeList
                where employee.ManagerId == 17
                select employee.Name;
                    | compiler
                    v rewrite
    var query = employeeList
        .Where(employee => employee.ManagerId == 17)
        .Select(employee => employee.Name);
    

示例1:

var newList = Enumerable.Range(0, list.Count - 1)
    .Select(i => list[i] / list[i + 1])
    .ToList();

示例2:

var result = Enumerable.Zip(list1.Select(f), list2.Select(g), (a, b) => a * b).Sum();

(*)我实际上不确定这是它的官方名称。如果你知道的话,请用正确的名称纠正我。

对于您的第一个示例,您可以尝试使用Zip和Skip:

var result = list.Zip(list.Skip(1), (x, y) => x / y);

它是如何工作的

如果您的初始列表是{1,2,3},则Skip(1)将导致{2,3};则Zip将{1,2,3}和{2,3}作为输入,并且告诉,对于每对数字,它将对它们进行除法。重复此操作,直到至少一个列表中没有更多元素为止,并将结果返回为IEnumerable

对于第二个例子,

var result = list1.Zip(list2, (x, y) => f(x) * f(y)).Sum();