C#无法转换`char'表达式输入`string'

时间:2018-01-26 17:08:07

标签: c# .net parsing c#-4.0

我有这段代码:

public class Kata
{
  public static bool Narcissistic(int value)
  {
     //add variale to hold final result
     int finalResult = 0;
     //get the length of the value input
     int valLength = value.ToString().Length;
     //convert value given into an array of ints
     string valString = value.ToString();
     //iterate over each number and multiply that number by the length of value input
     for (int i=0; i < valLength; i++) {
        //convert char at index[i] of stringified value to int and mutiply by # of digits, store to result
        finalResult += int.Parse(valString[i]) * valLength;
     }
     //return the result
     return finalResult == value;
  }
}

我在运行此操作时遇到错误,但我不太了解如何修复。我的目标是取一个数字(即1234)并将每个数字乘以它所包含的总位数(即1 * 4 + 2 * 4 + 3 * 4 ......等)。

4 个答案:

答案 0 :(得分:1)

假设您只有拉丁字母数字0到9,则可以使用(valString[i] - '0')代替int.Parse(valString[i])

valString[i]是一个字符,而不是一个字符串(int.Parse()会期望的)。并且字符在C#中自动转换为它们的Unicode整数代码,并且由于数字0到9具有连续的Unicode值,'0' - '0'将是数字0减去其自身的字符的Unicode值,i。即0,依此类推,直至'9' - '0'为9,大于0,i。即9。

如果字符串中可能包含非拉丁数字或非数字字符,则此代码无效。看看你的完整代码,应该满足这个假设,实际上,你是从int转换。

答案 1 :(得分:1)

这是一个更好的选择,完全避免字符串

public static bool Narcissistic(int value)
{
    if(value < 0) return false;
    int sum = 0;
    int count = 0;
    while(value>0)
    {
        sum += value%10;
        value /= 10;
        count++;
    }

    return value == (sum*count);
}

基本上value%10会给你最少的数字。然后value /= 10;将截断该数字。一旦value为零,您就会看到所有数字。你的公式(4 * 1 + 4 * 2 + 4 * 3 + 4 * 4)当然可以是4 *(1 + 2 + 3 + 4),这是数字乘以数字的总和。

并且可能没有负面数字&#34; Narcissistic&#34;所以你可以为他们返回false

答案 2 :(得分:0)

valString[i]将是char - 因为这是索引对字符串的作用。 int.Parse需要一个字符串。最简单的事情可能只是

finalResult += int.Parse(valString[i].ToString()) * valLength;

假设您想将单个字符数字转换为一位数整数。

这比传统的减去'0'的黑客更“危险”,因为如果char不是数字,你可以依赖int.Parse来抛出异常。

您还需要输入参数uint,或定义负数的行为。

答案 3 :(得分:-1)

int.Parse()需要一个字符串,但valString[i]是一个字符。您可以将其更改为valString[i].ToString(),但不是解析您可以利用数字字符按顺序编码的事实,方法是将它们转换为int并减去0整数的值:

public static bool Narcissistic(int value)
{ 
    int zero = (int)'0';
    string valueString = value.ToString();
    int total = 0;

    foreach(char c in valueString)
    {
       int digit = ((int)c - zero);
       total += digit * valueString.Length;
    }

    return total == value; 
} 

public static bool Narcissistic(int value)
{ 
    int zero = (int)'0';
    string valueString = value.ToString();

    return valueString.Select(c => (c - zero) * valueString.Length).Sum() == value; 
}      

如果你真的想要,你可以将第二个选项写成一行:

public static bool Narcissistic(int value)
{ 
    return value.ToString().Select(c => c - '0').Sum() * value.ToString().Length == value; 
}