什么是“输入”.Sum(b => b - '0')' 的意思以及为什么它不定义 'b' 就起作用了
本文关键字:为什么 意思 定义 起作用 Sum 输入 什么 | 更新日期: 2023-09-27 18:34:53
我真的是c#的初学者。我找到了这段 C# 代码:
int result;
string input;
result = 0;
Console.WriteLine("Give the number of which you want the sum.");
input = Console.ReadLine();
foreach (char c in input)
{
---> result = input.Sum(b => b - '0');
}
Console.WriteLine(result);
我对这句话感到困惑:
result = input.Sum(b => b - '0');
有人可以告诉我那条线是怎么回事吗?它使用变量b
,而它没有定义。'0'
代表什么?
对于初学者来说,这个问题有很多内容,所以让我们分解一下。
首先,假设您有一个这样的数字数组:
int[] numbers = new { 1, 2, 3 };
现在,您要将这些数字相加以求和。在大多数编程语言中,执行此操作的明显方法是使用这样的循环。
int sum = 0;
foreach(int b in numbers)
sum += b;
但是,有一种简短的方法可以通过使用 lambda 表达式来执行相同的操作。
int sum = numbers.Sum(b => b);
这样做的原因是因为在 lambda 表达式中,可以自动推断 b 的类型。它本质上是说 b 是 int 数组中称为数字的元素之一。
一开始这可能会有点混乱,直到你把它包起来。有一段时间,您可能需要在 foreach 循环和脑海中的 lambda 表达式之间进行转换。
您问题的第二部分是关于"0">
您在此处看到的是字符串中字符的语法。例如,假设您声明了一个如下所示的字符串:
string input = "Hello";
字符串实际上只是一个字符数组,它也可以这样表示:
char[] input = new { 'H', 'e', 'l', 'l', 'o' };
在计算机中,字符也只是数字。每个字符都有其等效的数字。例如,"H"是 72。请参阅 ASCII 表以供参考。
因为它实际上只是一个数字数组,所以你可以对它进行lambda表达式。
int sum = input.Sum(b => b);
最后,我们回到令人困惑的路线。
int result = input.Sum(b => b - '0');
希望到现在为止,你会明白这里发生了什么。字符串中字符的值相加,同时从每个元素中减去"0"字符 (48( 的值。或者换一种说法:
int result = 0;
foreach(char b in input)
result += b - '0';
晚安:)
b => b - '0'
是一个lambda表达式。b
表示输入中的每个char
。它获取输入中的每个字符,然后从中减去"0"并返回值。在这里,订阅'0'
是一个技巧。由于b
是一个char
,因此它被转换为int
并且转换的值是b
的ASCII
值。当您将 ASCII 值代入 0
时,您将获得数值。
例如ASCII
2
的值是50
,0
是48
。 当你从 48 中减去 50 时,你会得到 2,这是char
的数值。
因此,此代码只是从每个字符中替换"0",找到数值并获取它们的总和。
b =>
将b
定义为 lambda
foreach (char c in input)
{
result = input.Sum(b => b - '0');
}
这个 for 循环将从 input
值中的每个字符中获取 '0'
的值。
您可以使用以下内容获得相同的结果,该结果使用输入作为int
而不是string
。在我看来更容易理解。
int input = 0, result = 0;
int sum = 0;
Console.WriteLine("Give the number of which you want the sum.");
input = int.Parse(Console.ReadLine());
while (input != 0)
{
sum += input % 10;
input /= 10;
result += sum;
}
Console.WriteLine(result);
正如其他人所说,b => ...
是一个 Lambda 表达式,它适用于某些输入b
并做一些事情。在本例中,b
代表输入中的字符。
但是,问题中的代码实际上是错误的。它应该做的是计算用户输入的数字的交叉总数(所有数字的总和(,因此对于输入1234
结果将是 10
.
循环遍历 input
中的字符实际上是多余的,因为 Sum
函数已经这样做了。
该行
result = input.Sum(b => b - '0');
方法:
对于
input
中b
的每个字符,从b
中减去0
的字符代码并将其相加,计算给定数字的交叉总数。将此总和分配给result
。
这实际上将"0"到"9"之间的每个字符都变成了数字 0 到 9 并总结它。
在循环中执行此操作实际上是不必要的,并且非常具有误导性,因为Sum
循环是隐式的。所以实际上,这应该读作
Console.WriteLine("Give the number of which you want the sum.");
string input = Console.ReadLine();
int result = input.Sum(b => b - '0');
Console.WriteLine(result);