1

有人可以给我读下面的 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

4 回答 4

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
于 2013-08-21T06:00:14.493 回答
1

这个函数

  n => n % 2 == 1

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

  • true,如果 n 为奇数:n % 2 == 1(n 为奇数当且仅当它除以 2 时余数为 1)
  • 否则为假(如果 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();

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

于 2013-08-21T05:58:33.300 回答
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);
        });
于 2013-08-21T06:11:56.143 回答
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++;
  }
}

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

于 2013-08-21T06:05:32.340 回答