C# C如何在将用户输入放入数组之前验证它?

C# C如何在将用户输入放入数组之前验证它?,c#,arrays,validation,histogram,C#,Arrays,Validation,Histogram,我对C非常陌生,我想知道如何在将用户输入放入数组之前验证用户输入。我试图创建一个控制台应用程序来创建一个由星星组成的垂直和水平直方图。因此,我要求用户输入8个介于1-10之间的数字,并将结果打印到屏幕上作为直方图。 我需要三件事的帮助: 1.我如何使他们只能在菜单和数组中输入数字? 2.我不确定如何垂直显示柱状图,我已经做了水平柱状图,但不知道如何使其垂直。 3.另外,我想让标签沿着柱状图向下。例如 1 **** (Number of stars user selected) 2 ******

我对C非常陌生,我想知道如何在将用户输入放入数组之前验证用户输入。我试图创建一个控制台应用程序来创建一个由星星组成的垂直和水平直方图。因此,我要求用户输入8个介于1-10之间的数字,并将结果打印到屏幕上作为直方图。 我需要三件事的帮助: 1.我如何使他们只能在菜单和数组中输入数字? 2.我不确定如何垂直显示柱状图,我已经做了水平柱状图,但不知道如何使其垂直。 3.另外,我想让标签沿着柱状图向下。例如

1 **** (Number of stars user selected) 
2 ****** (Number of stars user selected)
3 ***** (Number of stars user selected)
4 * etc.
非常感谢您的帮助!事先非常感谢你 以下是我到目前为止得到的信息:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Exercise_3A
{
    class Program
    {
        static void Main(string[] args)
        {
            clsMainMenu MainMenu = new clsMainMenu();
            ConsoleKeyInfo ConsoleKeyPressed;

            do
            {
                MainMenu.DisplayMenu();
                ConsoleKeyPressed = Console.ReadKey(false);
                Console.WriteLine();
                switch (ConsoleKeyPressed.KeyChar.ToString())
                {
                    case "1":
                        clsHistogram Histogram = new clsHistogram();
                        Histogram.CreateHorizontalHistogram();
                        break;
                    case "2":
                        clsHistogram HistogramV = new clsHistogram();
                        HistogramV.CreateVerticalHistogram();
                        break;
                }
            } while (ConsoleKeyPressed.Key != ConsoleKey.Escape);

        }
    }
}

下面是一个使用int.TryParse方法计算输入数据的代码示例

    private static readonly char star = '*';
    private static readonly uint minValue = 1;
    private static readonly int maxValue = 10;

    private static void CreateHorizontalHistogram()
    {
        var limits = "a number between " + minValue + " and " + maxValue + ": ";
        Console.WriteLine("Please enter " + limits);

        var list = new List<int>();

        do
        {
            var message = string.Empty;
            bool isNumber = false;
            bool isRightSize = false;
            int output;

            do
            {
                var input = Console.ReadLine();      
                isNumber = int.TryParse(input, out output);
                if(isNumber)
                {
                    isRightSize = minValue <= output && output <= maxValue;
                    message = isRightSize ? "That will do: " : "Try again - value is not " + limits + output;
                }
                else
                {
                    message = "Try again - " + input + " is not a Number";
                }
                Console.WriteLine(message);
            }while(!isNumber || !isRightSize);

            Console.WriteLine("Entered number at position" + (list.Count + 1) + " : " + output);
            list.Add(output);
        }while(list.Count <= 8);

        Console.WriteLine("Your Histogram looks like this: ");
        foreach(var value in list)
        {
            Console.WriteLine(string.Empty.PadRight(value, star));
        }

        Console.WriteLine("Or like this with LINQ");
        list.ForEach(n => Console.WriteLine(string.Empty.PadRight(n, star)));
    }
注: 我使用了整数列表而不是数组int[]…我个人的偏好。 我改变了图表的创建方式。我的版本没有那么冗长。 我还添加了一个额外的示例,说明如何使用LINQ创建图表-始终看起来不错


如果您有任何问题,请告诉我。

请不要将三个问题合并为一个问题。为了清楚起见,每一个都应该单独处理。就第一点而言,我建议您采取以下两种可能的方法之一:bool isNumber=Int32.tryparsestnumberchosen,out var num;可以对其求值或使用正则表达式对输入求值:var reg=new Regex@[0-9];bool isNumber=reg.ismatchstrnumberselected;嗨,巴恩斯,对不起,我不知道不提多个问题。谢谢你的回答,我认为你的第一个解决方案对我来说是最好的。然而,我不太明白,在我的代码中我应该把这一行放在哪里?我还需要做些什么才能让它工作吗?例如,如果用户输入字母,则允许他们重试,直到输入数字。非常感谢你的帮助天啊!非常感谢你,巴恩斯。你是个天才。它工作得很好!我把它写进了我的代码,非常感谢你的帮助。现在我需要弄清楚如何垂直显示lol。再次非常感谢你,我真的很感谢你。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Exercise_3A
{
    class clsHistogram
    {
        string strNumberChosen = "";

        public void CreateHorizontalHistogram()
        {
            Console.WriteLine("Please enter a number between 1 and 10:");

            int[] intHistogramArray = new int[8];

            for (int intCounter = 0; intCounter < 8; intCounter++)
            {
                Console.WriteLine("Enter number " + (intCounter + 1) + " :");
                strNumberChosen = Console.ReadLine(); // Need Data Validation Here.             
            } // Populating Array.

            Console.WriteLine("Your Histogram looks like this: ");
            for (int intcounter = 0; intcounter < 8; intcounter++)
            {
                int intStarPlot = intHistogramArray[intcounter];
                while (intStarPlot > 0)
                {
                    Console.Write(" *");
                    intStarPlot -= 1;
                }
                Console.WriteLine();
            } // Display a Horizontal Array.
        }


        public void CreateVerticalHistogram()
        {
            Console.WriteLine("Please enter a number between 1 and 10:");

            int[] intHistogramArray = new int[8];

            for (int intCounter = 0; intCounter < 8; intCounter++)
            {
                Console.WriteLine("Enter number " + (intCounter + 1) + " :");
                strNumberChosen = Console.ReadLine(); // Need Data Validation Here.
            } // Populating Array.

            Console.WriteLine("Your Histogram looks like this: ");
            for (int intcounter = 0; intcounter < 8; intcounter++)
            {
                int intStarPlot = intHistogramArray[intcounter];
                while (intStarPlot > 0)
                {
                    Console.Write(" * \n");
                    intStarPlot -= 1;
                }
                Console.WriteLine();
            } // Display a Vertical Array.
        }
    }
}
    private static readonly char star = '*';
    private static readonly uint minValue = 1;
    private static readonly int maxValue = 10;

    private static void CreateHorizontalHistogram()
    {
        var limits = "a number between " + minValue + " and " + maxValue + ": ";
        Console.WriteLine("Please enter " + limits);

        var list = new List<int>();

        do
        {
            var message = string.Empty;
            bool isNumber = false;
            bool isRightSize = false;
            int output;

            do
            {
                var input = Console.ReadLine();      
                isNumber = int.TryParse(input, out output);
                if(isNumber)
                {
                    isRightSize = minValue <= output && output <= maxValue;
                    message = isRightSize ? "That will do: " : "Try again - value is not " + limits + output;
                }
                else
                {
                    message = "Try again - " + input + " is not a Number";
                }
                Console.WriteLine(message);
            }while(!isNumber || !isRightSize);

            Console.WriteLine("Entered number at position" + (list.Count + 1) + " : " + output);
            list.Add(output);
        }while(list.Count <= 8);

        Console.WriteLine("Your Histogram looks like this: ");
        foreach(var value in list)
        {
            Console.WriteLine(string.Empty.PadRight(value, star));
        }

        Console.WriteLine("Or like this with LINQ");
        list.ForEach(n => Console.WriteLine(string.Empty.PadRight(n, star)));
    }