Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.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#无法转换'char';表达式输入'string';_C#_.net_Parsing_C# 4.0 - Fatal编程技术网

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

C#无法转换'char';表达式输入'string';,c#,.net,parsing,c#-4.0,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

我有以下代码:

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;
  }
}
公共类Kata
{
公共静态布尔自恋(int值)
{
//添加变量以保存最终结果
int finalResult=0;
//获取输入值的长度
int valLength=value.ToString().Length;
//将给定的值转换为整数数组
字符串valString=value.ToString();
//迭代每个数字,并将该数字乘以输入值的长度
for(int i=0;i
当我运行这个程序时,我遇到了一个我理解的错误,但不知道如何修复。我的目标是取一个数字(即1234)并将每个数字乘以它包含的总位数(即1*4+2*4+3*4…等等)。

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)
{ 
    return value.ToString().Select(c => c - '0').Sum() * value.ToString().Length == value; 
}  

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

finalResult += int.Parse(valString[i].ToString()) * valLength;
假设将单个字符数字转换为一个数字整数是您的意图

这比传统的减去“0”的方法“危险”要小,因为如果字符不是数字,可以依赖int.Parse抛出异常


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

假设您只有拉丁数字字符0到9,您可以使用
(valString[i]-“0”)
而不是
int.Parse(valString[i])

valString[i]
是一个字符,而不是字符串(这是
int.Parse()
所期望的)。字符会自动转换为C#中的Unicode整数码,由于数字0到9具有连续的Unicode值,
'0'-'0'
将是数字0减去自身的字符的Unicode值,即。E0,依此类推,直到
'9'-'0'
比0多9,即。E九,


如果字符串中可能有非拉丁数字或非数字字符,则此代码将不起作用。查看完整的代码,应该满足这个假设,因为实际上,您是从int转换而来的。

这里有一个更好的选项,可以完全避免使用字符串

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);
}
公共静态bool自恋(int值)
{
如果(值<0)返回false;
整数和=0;
整数计数=0;
而(值>0)
{
总和+=值%10;
数值/=10;
计数++;
}
返回值==(总和*计数);
}
基本上,
值%10
将为您提供最低有效位。然后
值/=10将截断该数字。一旦
为零,您就可以看到所有数字。你的公式(4*1+4*2+4*3+4*4)当然可以是4*(1+2+3+4),这是数字的总和乘以数字


大概没有负数是“自恋的”,所以你可以为他们返回
false

无法读取未格式化为code的代码你在int和string之间来回转换,为什么?您得到的确切错误/问题是什么?如果您使用
%10
获取最低有效位,并使用
/10
截断最低有效位,则可以完全避免使用字符串。让我的+1让我们熟悉以下概念:它不应该是位数的幂而不是*长度吗?啊,我明白了你做到了!这正是我想要做的。使用for循环,获取字符串中的每个字符并将其转换为int。将尝试此方法并返回给您我必须承认我没有试图理解其背后的算法-实际计算可能在一行中完成,但在codegolf.stackexchange,他们的情况就不同了。com@juharr起初我看错了问题。现在应该好多了。最简单的情况是负整数,-符号是无效输入。OP应该定义为
uint
,或者添加异常处理,或者定义负数的行为。@dlatikay说得对!这是迄今为止对书面问题的最佳答案。。。尽管我怀疑他对“自恋”的解释是错误的,因此他应该提升到长度的力量,让负数成为可能的竞争者。当然,我的数字也处理得不好。@JoelCoehoorn实际上自恋的数字不会是负数,因为单个数字不会被认为是负数。
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);
}