有人可以给我读下面的 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();
大声朗读表达式将是
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
这个函数
n => 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 表达式,它从列表中选择奇数值
第 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);
});
至于你的问题,如果没有 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++;
}
}
为了简单起见,我只是用数组替换了列表。正如我之前在评论中所说,这是一个简单的模运算