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

时间:2014-10-13 15:17:07

标签: c# linq lambda

我是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表达式?

2 个答案:

答案 0 :(得分:7)

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();

(*)我不确定这是它的正式名称。如果你知道的话,请用正确的名字纠正我。

答案 1 :(得分:1)

对于您的第一个示例,您可以尝试使用ZipSkip

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

如何运作

如果您的初始列表是{1,2,3},则跳过(1)将导致{2,3};然后Zip将{1,2,3}和{2,3}作为输入,并告诉它,对于每对数字,它应该将它们分开。重复,直到至少有一个列表中没有其他元素,并将结果返回为IEnumerable

对于第二个例子,

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