C# 基于变量的第n个字符未按预期工作

C# 基于变量的第n个字符未按预期工作,c#,.net,implicit-conversion,C#,.net,Implicit Conversion,所以我有pow-一个包含数字的列表。我必须检查其他类似的数字:获取所有数字,并将pow中与特定数字具有相同索引的数字相加 所以如果我查4552,我需要得到pow[4]+pow[5]+pow[5]+pow[2]。因为我是一个noob,所以我尝试将数字转换为字符串,使用循环获取字符,然后再转换回int以获取索引。因此,代码如下所示,用于获得4550和4559之间的总和: for (int i = 4550; i < 4560; i++) {

所以我有pow-一个包含数字的列表。我必须检查其他类似的数字:获取所有数字,并将pow中与特定数字具有相同索引的数字相加

所以如果我查4552,我需要得到pow[4]+pow[5]+pow[5]+pow[2]。因为我是一个noob,所以我尝试将数字转换为字符串,使用循环获取字符,然后再转换回int以获取索引。因此,代码如下所示,用于获得4550和4559之间的总和:

        for (int i = 4550; i < 4560; i++)
        {
            int sum = 0;
            for (int j = 0; j < i.ToString().Length; j++)
            {
                sum += pows[Convert.ToInt32(i.ToString()[j])]; //here is the error - index was out of range
                //do something with sum (like store it in another list)
            }
        }
那么这有什么错呢

编辑:为了避免混淆。。。pow有10个元素,从索引0到9


解决方案:我的代码的问题是我得到的是字符代码,而不是数字本身,谢谢Steve Lillis。虽然Dmitry Bychenko提供的解决方案比我的尝试要好得多。谢谢大家。

这段代码只包含一个字符,如“4”,即字符代码59:

c = i.ToString()[j]
然后,这段代码将该字符转换为整数。它不像您期望的那样解析它,因此“4”的结果是59,而不是4:

Convert.ToInt32(c)
改为这样做:

int.Parse(c.ToString())

您所寻找的类似于:

C中的模数%比转换为字符串更简单、更快:


像这样又快又脏的尝试

        int currentDigit;
        int sum;
        for (int i = 4550; i < 4560; i++)
        {
            sum = 0;
            currentDigit = i;
            while (currentDigit > 0)
            {
                if (pow.Count > (currentDigit % 10))
                {
                    sum += pow[((currentDigit % 10))];
                }
            }
        }

请注意,列表具有从零开始的索引,因此当您执行pow[1]时,实际上正在访问列表中的第二个元素。这就是你想要的吗?

哇,真奇怪。当尝试sum+=…时,它再次死机,并出现相同的错误。。。但是我放了一个控制台;得到49分?!更新了我的答案,因为我刚刚意识到发生了什么:
        int currentDigit;
        int sum;
        for (int i = 4550; i < 4560; i++)
        {
            sum = 0;
            currentDigit = i;
            while (currentDigit > 0)
            {
                if (pow.Count > (currentDigit % 10))
                {
                    sum += pow[((currentDigit % 10))];
                }
            }
        }