从循环存储用户输入以在另一种方法中进行进一步操作的最佳方法

Posted

技术标签:

【中文标题】从循环存储用户输入以在另一种方法中进行进一步操作的最佳方法【英文标题】: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
        

    

【问题讨论】:

使用静态变量 【参考方案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");
        
    

【讨论】:

谢谢,小方法看起来确实不错。

以上是关于从循环存储用户输入以在另一种方法中进行进一步操作的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

如何通过按下按钮从 tkinter 输入字段返回变量以在另一个函数中使用?

在 GAS 中进行系统调用并在 .data 部分中使用变量并访问它们以在另一个子例程中进行系统调用

数据方法中的数组在一种方法中得到更新,但在另一种方法中仍然为空

如何从一个账户访问 s3 存储桶中的数据以在另一个账户中使用 redshift 处理数据?

创建一个 kivy 应用程序以在一个屏幕上接收用户的输入并在另一个屏幕上显示这些图像

如何从网站中提取数据计数器以在另一个 HTML 项目中用作 JS 变量