Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 'input.Sum(b=>b-'0')`是什么意思?为什么它不定义'b'?_C# - Fatal编程技术网

C# 'input.Sum(b=>b-'0')`是什么意思?为什么它不定义'b'?

C# 'input.Sum(b=>b-'0')`是什么意思?为什么它不定义'b'?,c#,C#,我真的是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(re

我真的是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”代表什么?

b=>b-“0”是a。b代表输入中的每个字符。它接受输入中的每个字符,然后从中减去“0”并返回值。在这里,子斜杠“0”是一个技巧。因为,b是一个字符,它被转换为int,转换的值是b的ASCII值。当您将ASCII值细分为0时,您将得到数值

例如,ASCII值2为50,0为48。当你从50中减去48,你会得到2,这是字符的数值

因此,这段代码只是从每个字符中对“0”进行细分,找到数值并得到它们的总和

b => 
将b定义为lambda

foreach (char c in input)
{
    result = input.Sum(b => b - '0');
}
此for循环将从输入值中的每个字符中获取“0”的值

您可以通过以下方法获得相同的结果,即将输入用作int而不是字符串。在我看来更容易理解

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

在输入中的字符上循环实际上是多余的,因为Sum函数已经这样做了

线路

result = input.Sum(b => b - '0');
指:

对于输入中的每个字符b,从b中减去字符代码0并求和,计算给定数字的交叉总数。将此总和指定给结果

这实际上将“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);

对于初学者程序员来说,这个问题有很多问题,所以让我们把它分解一下

首先,让我们假设你有一个这样的数字数组:

int[] numbers = new { 1, 2, 3 };
string input = "Hello";
char[] input = new { 'H', 'e', 'l', 'l', 'o' };
现在,你想把这些数字加起来得到总数。在大多数编程语言中,最明显的方法是使用这样的循环

int sum = 0;

foreach(int b in numbers)
    sum += b;
然而,通过使用lambda表达式,有一种简单的方法可以完成同样的事情

int sum = numbers.Sum(b => b);
之所以这样做,是因为在lambda表达式中,可以自动推断b的类型。它本质上是说b是int数组中名为numbers的元素之一

这在一开始可能会有点让人困惑,直到你把你的头绕在它周围。在一段时间内,您可能需要在foreach循环和头部的lambda表达式之间进行转换

问题的第二部分是关于“0”

这里看到的是字符串中字符的语法。例如,假设您声明了如下字符串:

int[] numbers = new { 1, 2, 3 };
string input = "Hello";
char[] input = new { 'H', 'e', 'l', 'l', 'o' };
字符串实际上只是一个字符数组,也可以这样表示:

int[] numbers = new { 1, 2, 3 };
string input = "Hello";
char[] input = new { 'H', 'e', 'l', 'l', 'o' };
在计算机中,字符也只是数字。每个字符都有其等效的数字。例如,“H”是72。有关参考信息,请参阅

因为它实际上只是一个数字数组,你可以在上面做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表达式,0是一个字符。Lambda:了解b通常是什么,阅读关于Lambda的解释。在input.Sumb=>b-'0'的上下文中;b是输入的每个字母,所以整个意思是:返回每个字符的int值的和-字符串输入的int值0@sloef202:当遇到这样的问题时,作为一般性建议:利用工具提示和VisualStudio中的F1和F12转到定义支持,这真是太棒了!char包含一个UTF-16代码单元,其中一个或两个组成Unicode码点。算法假设一个“0”是一个字符文本。提到ASCII掩盖了这些事实。您链接的ASCII表实际上是一个Windows-1252表,它在页面上含糊不清地说。但是,对于.NET、Java、HTML、JavaScript和…,您应该参考Unicode表,例如,或者,我只是在谷歌上搜索并粘贴了第一个看起来合理的ASCII表。这只是为了说明每个角色都有一个数字,为了这个目的,它会 干得不错。我同意我本可以发布更准确的内容,但你发布的链接并没有显示一个清晰的表格来说明这一点。