Dejan
Dejan

Reputation: 1028

Apply lambda expression for specific indices in list c#

I am new to lambda expression and I have problem to convert parts of code which involves indices of list inside the loop to equivalent lambda expression.

Example 1: Working with different indices inside one list

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

Example 2: Working with indices from two lists

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

How to write equivalent lambda expressions?

Upvotes: 4

Views: 541

Answers (2)

mihai
mihai

Reputation: 4742

For your first example you can try using Zip and Skip:

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

How does it work

If your initial list is {1, 2, 3}, then Skip(1) would result in {2, 3}; then Zip takes {1, 2, 3} and {2, 3} as inputs, and tells that, for each pair of numbers, it shall divide them. Repeat until there are no more elements in at least one list, and return the result as IEnumerable.

For the second example,

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

Upvotes: 1

Timothy Shields
Timothy Shields

Reputation: 79521

A lambda expression is something that looks like {params} => {body}, where the characteristic symbol is the => "maps to." What you are asking for are typically referred to as LINQ query expressions, which come in two styles:

  • The functional style of query is typically a sequence of chained calls to LINQ extension methods such as Select, Where, Take, or ToList. This is the style I have used in the examples below and is also the much-more prevalent style (in my experience).

  • The "language integrated" style (*) uses built-in C# keywords that the compiler will turn into the functional style for you. For example:

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

Example 1:

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

Example 2:

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

(*) I'm not actually sure this is the official name for it. Please correct me with the proper name if you know it.

Upvotes: 7

Related Questions