什么是“输入”.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'代表什么?

什么是“输入”.Sum(b => b - '0')' 的意思以及为什么它不定义 'b' 就起作用了

对于初学者来说,这个问题有很多内容,所以让我们分解一下。

首先,假设您有一个这样的数字数组:

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并且转换的值是bASCII值。当您将 ASCII 值代入 0 时,您将获得数值。

例如ASCII 2的值是50048。 当你从 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');

方法:

对于inputb的每个字符,从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);