【问题标题】:C# Cannot convert `char' expression to type `string' [closed]C#无法将“char”表达式转换为“string”类型[关闭]
【发布时间】:2018-01-26 17:08:07
【问题描述】:

我有这个代码:

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...等)。

【问题讨论】:

  • 无法读取未格式化为代码的代码
  • 你在int和string之间来回转换一堆,为什么?您得到的确切错误/问题是什么?
  • 如果您使用%10 获取最低有效数字并使用/10 截断最低有效数字,则可以完全避免使用该字符串。
  • 感谢我的 +1 让我们熟悉 narcissistic numbers 的概念:它不应该是位数而不是 * 长度的幂吗?

标签: c# .net parsing c#-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 值,即。 e. 0,依此类推,直到'9' - '0' 比 0 多 9,即。 e. 9.

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

【讨论】:

  • 一般情况下为负整数,- 号为无效输入。 OP 应该定义为uint 或者添加异常处理,或者定义负数的行为。
  • @dlatikay 好点!
【解决方案2】:

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

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),也就是位数的总和乘以位数。

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

【讨论】:

  • 这是迄今为止所写问题的最佳答案......虽然我怀疑他对“自恋”的解释是错误的,因此他应该提高长度的力量,做出一个负数可能的竞争者。当然,我的也处理不好。
  • @JoelCoehoorn 实际上自恋数字不会是负数,因为单个数字不会被视为负数。
【解决方案3】:

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

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

假设将单个字符数字转换为一位整数是您的意图。

这比传统的减去 '0' 的技巧更“危险”,因为如果 char 不是数字,您可以依靠 int.Parse 引发异常。

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

【讨论】:

  • 啊啊啊我知道你在那里做了什么!这正是我正在尝试做的。使用 for 循环,获取字符串中的每个字符并将其转换为 int。会试试这个并回复你
  • 我必须承认我并没有试图理解它背后的算法——实际的计算很可能是在单线中完成的,但在 codegolf.stackexchange.com 上对他们来说是另一回事
【解决方案4】:

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

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; 
}  

【讨论】:

  • @juharr 我起初误读了这个问题。现在应该好多了。
猜你喜欢
  • 2015-08-07
  • 2020-06-16
  • 1970-01-01
  • 2022-07-06
  • 2020-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多