对列表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表达式?
lambda表达式看起来像{params} => {body}
,其中特征符号是=>
"映射到"。您所要求的通常被称为LINQ查询表达式,有两种样式:
-
查询的函数样式通常是对LINQ扩展方法(如
Select
、Where
、Take
或ToList
)的一系列链式调用。这是我在下面的例子中使用的风格,也是(根据我的经验)更流行的风格。 -
"语言集成"样式(*)使用内置的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();