使用foreach难以对大量数字进行项求和

时间:2019-02-20 23:11:15

标签: c# foreach

我一直在尝试欧拉计划的挑战之一,但是我一直困扰着一个烦人的问题。

double sum = 0;
string numbers = "3710728753390210279...."

foreach (int item in numbers) sum += item;

Console.WriteLine(sum);
Console.ReadLine();

当我运行此代码时,它不会按照期望的方式拆分每个数字,例如相反,第一个数字3将为51,第二个数字7将为55。我不知道从何处获得这些数字。

谢谢。

4 个答案:

答案 0 :(得分:4)

这里的其他答案没有说明为什么您看到那些意外的数字。

我认为您可能期望循环foreach (int item in numbers)循环遍历字符串中的各个“数字”,并将这些数字自动转换为整数。那不是正在发生的事情(嗯,是的,但不是您的期望)。

foreach循环将string转换为IEnumerable<char>,并循环访问以char开头的字符串中的每个'3', '7', '1', ...字符。

.Net中,字符和字符串以UTF-16 unicode编码(如@TomBlodget在注释中指出的那样)。这意味着每个char都可以转换为其字符代码单位。您的代码实际上将字符代码单位相加。

C#中,字符'0', '1',..,'9'的代码单位在48,...,57范围内。因此,您可以执行类似@Yeldar的答案:

foreach (char item in numbers) 
    sum += item - '0';     //  if item == '9' this is equivalent to 57 - 48 = 9

因此,如果字符串仅包含数字,则减去'0'字符将把char隐式转换为与其对应的int,您最终将得到它表示的实际数值(即'7' - '0' => 55 - 48 = 7)。

此处的其他答案提供了解决此问题的解决方案。我认为这对解释为什么会发生很有帮助。

答案 1 :(得分:1)

如果您知道字符串仅包含数字,则可以使用该功能:

string numbers = "3710728753390210279";
int sum = numbers.Sum(x => x - '0');

如果您不确定它仅包含数字,则将过滤掉非数字:

int sum = numbers.Where(char.IsDigit).Sum(x => x - '0');

答案 2 :(得分:0)

如果您确定字符串中仅包含数字,则可以实际减去char '0'的值,这将为您带来神奇的作用:

int sum = 0;
string numbers = "371";

foreach (char item in numbers) 
    sum += item - '0';

Console.WriteLine(sum);

请注意,char中有foreach,因此没有隐式转换为int。此外,int也用于sum,而不是double,因为在这里实际上不需要浮点数。

答案 3 :(得分:0)

该解决方案稍微冗长一些,但它可以让您清楚地了解正在发生的情况,并且还可以排除字符串中可能弹出的任何非数字字符:

double sum = 0;
string numbers = "3710728753390210279";

foreach (char item in numbers)
{
    int intVal;
    if(int.TryParse(item.ToString(), out intVal))
        sum += intVal;
}
Console.WriteLine(sum);