【问题标题】:Return statement in a digit sum output数字和输出中的返回语句
【发布时间】:2015-04-05 09:05:19
【问题描述】:

所以我需要一种方法,它基本上会要求用户输入数字。然后它将检查从 0 到 1000 的所有数字,并返回数字总和等于用户给出的数字的数字。

我不确定我的代码是否正确以及它是否有效,因为我无法检查它,因为 return 语句不能以我认为的方式工作。

    public static string stevilo()
    {
        Console.WriteLine("Enter your number! ");
        string vnos = Console.ReadLine();
        int x = Convert.ToInt32(vnos);
        int sum = 0;
        string a= " ";


            foreach (var n in Enumerable.Range(0,1000))
            {
                if (n.ToString().ToCharArray().Sum(c => c - '0') == sum)
                    a = a + n.ToString();   

            }
    return (a);

        }

所以如果我的代码看起来像这样(上图),它总是会返回一个空字符串,因为它在方法的开头是空的。

但是,如果我像这样(如下)编写代码,我会收到一条消息:

并非所有代码路径都返回值

 public static string stevilo()
    {
        Console.WriteLine("Enter your number! ");
        string vnos = Console.ReadLine();
        int x = Convert.ToInt32(vnos);
        int sum = 0;
        string a= " ";


            foreach (var n in Enumerable.Range(0,1000))
            {
                if (n.ToString().ToCharArray().Sum(c => c - '0') == sum)
                    a = a + n.ToString();
                return (a);

            }

        }

【问题讨论】:

    标签: c# sum return digit


    【解决方案1】:

    错误在这一行

    if (n.ToString().ToCharArray().Sum(c => c - '0') == sum)
    

    应该是

    if (n.ToString().ToCharArray().Sum(c => c - '0') == x)
    

    当然,您需要更好的输出格式。所以我建议使用 StringBuilder 来更好地处理代码所需的字符串连接。

    public static string stevilo()
    {
        Console.WriteLine("Enter your number! ");
        string vnos = Console.ReadLine();
        int x = Convert.ToInt32(vnos);
        StringBuilder sb = new StringBuilder();
        foreach (var n in Enumerable.Range(0,1000))
        {
            if (n.ToString().ToCharArray().Sum(c => c - '0') == x)
                sb.Append(n.ToString() + ",");   
    
        }
        if(sb.Length > 0) sb.Length--;
        return sb.ToString();
    }
    

    另外,如果你想用 LinQ 完全隐藏 foreach 循环,还有这个变体

    public static string stevilo()
    {
        Console.WriteLine("Enter your number! ");
        string vnos = Console.ReadLine();
        int x = Convert.ToInt32(vnos);
        var list = Enumerable.Range(0, 1000)
                             .Where(z => z.ToString()
                             .ToCharArray()
                             .Sum(c => c - '0') == x);
        return string.Join(",", list);
    }
    

    【讨论】:

    • 天哪,非常感谢,不知何故,我确信问题出在退货声明上,我什至没有考虑其他任何事情......我觉得很愚蠢 xD 哈哈谢谢你!
    • +1 用于代码审查。但是请你解释一下这行n.ToString().ToCharArray().Sum(c => c - '0') == x 吗?
    • @ChakerMallek n.ToString().ToCharArray() 从数值 n 生成一个字符数组(IE 123 变为 '1'、'2'、'3')。在这个“序列”中应用了 Sum 扩展。 Sum 扩展需要数字输入。该输入是从序列中的当前 char 值中减去 char '0' 的值而获得的。 ('1' - '0' = 1个字符自动转换)
    • 很好的解释。谢谢@史蒂夫
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多