如何阅读这个lambda表达式

时间:2013-08-21 05:55:25

标签: c# .net lambda

有人可以读给我以下行lambda。

n => n % 2 == 1 

另外如果我必须编写没有lambda的同一段代码,我该怎么写呢。它可能会让我明白。

另一段代码在

下面
List<int> numbers = new List<int>{11,37,52};
List<int> oddNumbers = numbers.where(n => n % 2 == 1).ToList();

4 个答案:

答案 0 :(得分:4)

大声朗读表达式

n 'goes to' n modulus two equals one
n     =>    n    %     2    ==    1

基本上,您可以将此lambda视为一个函数,当提供给它的值(n)为奇数且为正时返回true,否则为false。您也可以将其写为方法

bool IsOddAndPositive(int n)
{
    return n % 2 == 1;
}

在您的代码段中使用它将是

List<int> numbers = new List<int>{11, 37, 52};
List<int> oddNumbers = numbers.Where(IsOddAndPositive).ToList();

结果(你指定的内容和方法示例)是

11, 37

答案 1 :(得分:1)

这个功能

  n => n % 2 == 1

接受一个参数(n)并返回布尔值:

  • true,如果n为奇数:n%2 == 1(当且仅当除以2时n为余数1时,n为奇数)
  • 否则为假(如果n为偶数)

当重写为普通函数时,它将等同于

  Boolean IsOdd(int n) { -- <- I've named it "IsOdd" since lambda functions have no explict names while ordinary functions have
    return n % 2 == 1;
  }

您的代码

  List<int> oddNumbers = numbers.where(n => n % 2 == 1).ToList();

我是一个LINQ表达式,它从列表中选择奇数值

答案 2 :(得分:0)

关于你的问题,如何在没有lambda的情况下编写它:

int[] digits =  {1,2,3,4,5,6,7,8,9,10};
int[] OddDigits = new int[5];

for(int i = 0; i < digits.Length; i++)
{
  if(digits[i] % 2 == 1)
  {
       int x = 0;
   OddDigits[x] = digits[i];
       x++;
  }
}

为了简单起见,我只是用数组替换了列表。正如我在前面的评论中所述,这是一个简单的模运算

答案 3 :(得分:0)

第1行实例化3个整数的列表 %运算符(也称为模运算符)在将第一个操作数除以第二个操作数后计算余数

第二行的结果将是一个包含11和37的列表。

你可以使用foreach这样写这个:

        List<int> numbers = new List<int> { 11, 37, 52 };
        List<int> oddNumbers = new List<int>();
        foreach (var num in numbers)
        {
            if (num % 2 == 1)
            {
                oddNumbers.Add(num);
            }
        }

您也可以使用Array.ForEach,如下所示:

        numbers.ForEach(num =>
        {
            if (num % 2 == 1)
                oddNumbers.Add(num);
        });