【问题标题】:Best way to store user input from loop for further operations in another method从循环存储用户输入以在另一种方法中进行进一步操作的最佳方法
【发布时间】:2021-12-25 01:36:18
【问题描述】:

这只是一个例子,我希望能够在第二种方法中使用第一种方法中的数组中存储的值来求算术平均值,问题是我如何访问它?还是数组本身是一个错误的解决方案?

using System;
namespace arithmetic_mean
{
    class Program

    {
        static void Main(string[] args)

        {
            Console.WriteLine("How many decimal numbers do you plan to enter?");
            string userInput = Console.ReadLine();
            int num_user;
            int.TryParse(userInput, out num_user);

            first_method(num_user);
        }

        static void first_method(int num_user)
        {
            string[] newarray = new string[num_user];
            for (int i = 0; i < num_user; i++)
            {
                Console.WriteLine("Enter a decimal number:");
                newarray[i] = Console.ReadLine();
            }
        }

        static void second_method(string newarray)
        {
            Convert.ToDouble(newarray);
            // get arithmetic_mean
        }

    }
}

【问题讨论】:

  • 使用静态变量

标签: c# arrays methods


【解决方案1】:

您的代码在样式和最佳设计实践方面存在很多问题。我不会在这里讨论这个问题,只关注这个问题:除了 first_method,我如何使用 first_method 中的数组?

有几种方法可以在另一种方法中使用来自一种方法的值。最简单的方法是通过返回值。我重写了 first_method 以返回数组:

static string[] first_method(int num_user) // The signature changed: void -> string[]
{
    string[] newarray = new string[num_user];
    for (int i = 0; i < num_user; i++)
    {
        Console.WriteLine("Enter a decimal number:");
        newarray[i] = Console.ReadLine();
    }

    return newarray; // Added this line.
}

所以现在您可以在 Main 中使用该数组:

static void Main(string[] args)

{
    Console.WriteLine("How many decimal numbers do you plan to enter?");
    string userInput = Console.ReadLine();
    int num_user;
    int.TryParse(userInput, out num_user);

    string[] inputs = first_method(num_user); // The return value of first_method is now stored.

    // Now it's possible to use the array in second_method:
    foreach(var input in inputs)
        second_method(input);
}

同样,您的代码还有很多其他问题,但您显然是新手。我希望看到你在不久的将来变得更好!

【讨论】:

  • 谢谢,提供了很多选项,我会逐一介绍。
【解决方案2】:

在一般情况中,您可以只枚举值而不存储它们(想象一下,您从一个数据库中获取值并且您有100 亿个),即

  using System.Collections.General;
  using System.Linq;

  ... 

  static IEnumerable<double> first_method(int num_user) {
    // for eaxh user
    for (int i = 0; i < num_user; ++i) {
      // we keep asking until valid value is provided
      while (true) {
        Console.WriteLine($"For user #{i + 1} enter a decimal number: ");

        if (double.TryParse(Console.ReadLine(), out var result)) {
          // we return result and keep on doing for the next user
          // note yield return, not return
          yield return result;

          break;
        }

        Console.WriteNumber("Syntax error. Please, repeat again"); 
      }
    }
  }

然后,只要你想要一个集合,你就可以物化枚举:

  double[] data = first_method(num_user).ToArray();

如果你想计算算术平均值

  static void second_method(int num_user)
  {
     double mean = first_method(num_user).Average();    
      ... 
  }

甚至,没有second_method

   static void Main(string[] args)
   {
        int num_user; 

        do { // keep asking until correct value provided
            Console.WriteLine("How many decimal numbers do you plan to enter?");
            string userInput = Console.ReadLine();
        } 
        while(!int.TryParse(userInput, out num_user) && num_user > 0);

        double mean = first_method(num_user).Average();  

        Console.WriteLine($"users: {num_user}, mean: {mean}"); 
    }

【讨论】:

  • 谢谢,我知道不用第二种方法也可以,但我想我会坚持下去,只是为了练习一段时间。
【解决方案3】:

创建一个列表 把它们加进去 并将其传递给方法。 最简单、清晰、简单。

【讨论】:

    【解决方案4】:

    我相信最好的方法是制作带有参数并返回操作结果的小方法。在下面的示例中,您可以看到在 Main 方法中有 3 行代码,它们是高级描述程序应该做什么。从控制台读取数字,然后计算平均值,并将平均值打印到控制台。

    ReadNumberFromConsole 之类的方法具有明确定义的名称,因此即使不阅读它的代码,您也可以理解它的作用。返回工作结果,以便将其传递给下一个方法。这样您就可以在需要时轻松测试和修改代码。

    using System;
    
    namespace ConsoleApp7
    {
        internal class Program
        {
            private static void Main(string[] args)
            {
                decimal[] numbers = ReadNumbersFromConsole();
                decimal mean = CalculateMean(numbers);
                PrintMean(mean);
            }
    
            private static decimal[] ReadNumbersFromConsole()
            {
                string userInput = string.Empty;
    
                Console.WriteLine("How many decimal numbers do you plan to enter?");
                userInput = Console.ReadLine();
                int numbersLength = int.Parse(userInput);
    
                decimal[] numbers = new decimal[numbersLength];
                for (int i = 0; i < numbersLength; i++)
                {
                    Console.WriteLine("Enter a decimal number:");
                    userInput = Console.ReadLine();
                    decimal number = decimal.Parse(userInput);
                    numbers[i] = number;
                }
    
                return numbers;
            }
    
            private static decimal CalculateMean(decimal[] numbers)
            {
                // Do your calculations here
                return 0;
            }
    
            private static void PrintMean(decimal mean)
            {
                // Example display
                Console.WriteLine($"Calculate mean is {mean}");
            }
        }
    }
    

    【讨论】:

    • 谢谢,小方法看起来确实不错。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多