从控制台应用程序中的列表中检索数据

时间:2016-03-02 14:17:20

标签: c# list

我正在编写一个可供教师用来保存和检索学生数据的控制台应用程序。

我想从studentInfoNamestudentInfoClassAndNumber的列表中检索元素,以便用户可以输入学生的姓名并获取所有其他信息,例如中间名,姓氏,班级和数字。

我尝试使用foreach循环,但它似乎无法正常工作。

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

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            DrawStarLine();
            DrawTitle();
            DrawMenu();
            int answer = int.Parse(Console.ReadLine());
            if (answer == 1)
            {

                Console.WriteLine("Enter information about a student");
                List<string> studentInfoName = new List<string>();
                Console.Write("Name: ");
                studentInfoName.Add(Console.ReadLine());
                Console.Write("Middle name: ");
                studentInfoName.Add(Console.ReadLine());
                Console.Write("Last name: ");
                studentInfoName.Add(Console.ReadLine());
                List<int> studentInfoClassAndNumber = new List<int>();
                Console.Write("Class ");
                studentInfoClassAndNumber.Add(int.Parse(Console.ReadLine()));
                Console.Write("Number ");
                studentInfoClassAndNumber.Add(int.Parse(Console.ReadLine()));
            }
            else if (answer == 2)
            {

                Console.WriteLine("Enter the name of the student that you want to retrieve information about");
              ?????????????????????????????????????????????????
            }
            else
            {
                ErrorMessage();
            }
            Console.ReadKey();
        }
        private static void ErrorMessage()
        {
            Console.WriteLine("Typing error, press key to continue.");
        }
        private static void DrawStarLine()
        {
            Console.WriteLine("************************");
        }
        private static void DrawTitle()
        {
            DrawStarLine();
            Console.WriteLine("+++ Student Information Database +++");
            DrawStarLine();
        }
        private static void DrawMenu()
        {
            DrawStarLine();
            Console.WriteLine(" 1. Enter information about a student.");
            Console.WriteLine(" 2. Retrieve information about a student available in the program");
            Console.WriteLine(" 3. Exit from the program");
            DrawStarLine();
            Console.WriteLine("Make your choice: type 1, 2, or 3 for exit");
            DrawStarLine();
        }

        }
    }

3 个答案:

答案 0 :(得分:0)

您必须在if:

之外初始化studentInfoClassAndNumber和studentInfoName
static void Main(string[] args)
    {
        DrawStarLine();
        DrawTitle();
        DrawMenu();

        List<int> studentInfoClassAndNumber = new List<int>();
        List<string> studentInfoName = new List<string>();

        int answer = int.Parse(Console.ReadLine());
        if (answer == 1)
        {

            Console.WriteLine("Enter information about a student");

            Console.Write("Name: ");
            studentInfoName.Add(Console.ReadLine());
            Console.Write("Middle name: ");
            studentInfoName.Add(Console.ReadLine());
            Console.Write("Last name: ");
            studentInfoName.Add(Console.ReadLine());

            Console.Write("Class ");
            studentInfoClassAndNumber.Add(int.Parse(Console.ReadLine()));
            Console.Write("Number ");
            studentInfoClassAndNumber.Add(int.Parse(Console.ReadLine()));
        }
        else if (answer == 2)
        {

            Console.WriteLine("Enter the name of the student that you want to retrieve information about");
          ?????????????????????????????????????????????????
        }
        else
        {
            ErrorMessage();
        }
        Console.ReadKey();
    }

答案 1 :(得分:0)

您在if语句中声明了列表作为局部变量,因此这是它们的作用域。当您离开该if语句时,您将离开该范围,并且您不再能够访问在其中声明的变量。试试这个:

var studentInfoName = new List<string>();
var studentInfoClassAndNumber = new List<int>();
if (answer == 1)
            {

                Console.WriteLine("Enter information about a student");
                Console.Write("Name: ");
                studentInfoName.Add(Console.ReadLine());
                Console.Write("Middle name: ");
                studentInfoName.Add(Console.ReadLine());
                Console.Write("Last name: ");
                studentInfoName.Add(Console.ReadLine());
                Console.Write("Class ");
                studentInfoClassAndNumber.Add(int.Parse(Console.ReadLine()));
                Console.Write("Number ");
                studentInfoClassAndNumber.Add(int.Parse(Console.ReadLine()));
            }

现在在你的其他地方,你可以这样做:

foreach(string s in studentInfoName){
...
}

有些事情要注意,我使用var而不是在评估的左侧明确声明类型,因为它节省了行空间并遵循正确的编码标准(尽管不是完全必要的)。

我还建议将studentInfoName重命名为studentName,因为它同样清晰且更短。

另一个建议是,如果您计划在该特定函数之外使用这些变量,请创建一个属性。属性写在类中但不在任何方法之内,并遵循以下格式:

private Type _variableName;

public Type VariableName
{
get{ return _variableName;}
set{_variableName = value;}
}

该属性的好处是,如果其他类具有此类的实例,则可以访问这些变量。如果您决定使用xaml创建一个gui,它们也是数据绑定的必要条件。 VS有一个代码片段propfull(tab,tab)将为你自动生成大部分属性代码,或prop(tab,tab)将自动生成属性而没有支持字段(私有变量)

答案 2 :(得分:0)

对于初学者,您需要将Main()方法中当前所有内容放入无限while()循环中。请务必在if / else块中添加一个条件,检查选项3“3。退出程序”,这样您的用户就可以退出。

现在,看起来您的程序允许用户选择1个选项,它会执行该选项,然后退出(从而在运行之间丢失数据)。

进行此更改后,移动 List<string> studentInfoName = new List<string>();List<int> studentInfoClassAndNumber = new List<int>(); 直接跟随     static void Main(string[] args)

结果应如下所示:

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

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            List<string> studentInfoName = new List<string>();
            List<int> studentInfoClassAndNumber = new List<int>();
            while(true)
            {
                DrawStarLine();
                DrawTitle();
                DrawMenu();
                int answer = int.Parse(Console.ReadLine());
                if (answer == 1)
                {
                    Console.WriteLine("Enter information about a student");
                    Console.Write("Name: ");
                    studentInfoName.Add(Console.ReadLine());
                    Console.Write("Middle name: ");
                    studentInfoName.Add(Console.ReadLine());
                    Console.Write("Last name: ");
                    studentInfoName.Add(Console.ReadLine());
                    Console.Write("Class ");
                    studentInfoClassAndNumber.Add(int.Parse(Console.ReadLine()));
                    Console.Write("Number ");
                    studentInfoClassAndNumber.Add(int.Parse(Console.ReadLine()));
                }
                else if (answer == 2)
                {
                    Console.WriteLine("Student Information");
                    foreach(String nextEntry in studentInfoName)
                    {
                        Console.WriteLine(nextEntry);
                    }

                    Console.WriteLine("Course Information");
                    foreach(String nextEntry in studentInfoClassAndNumber)
                    {
                        Console.WriteLine(nextEntry);
                    }

                }
                else if(answer == 3)
                {
                    return 0;
                else
                {
                    ErrorMessage();
                }
                Console.ReadKey();
            }
        }
        private static void ErrorMessage()
        {
            Console.WriteLine("Typing error, press key to continue.");
        }
        private static void DrawStarLine()
        {
            Console.WriteLine("************************");
        }
        private static void DrawTitle()
        {
            DrawStarLine();
            Console.WriteLine("+++ Student Information Database +++");
            DrawStarLine();
        }
        private static void DrawMenu()
        {
            DrawStarLine();
            Console.WriteLine(" 1. Enter information about a student.");
            Console.WriteLine(" 2. Retrieve information about a student available in the program");
            Console.WriteLine(" 3. Exit from the program");
            DrawStarLine();
            Console.WriteLine("Make your choice: type 1, 2, or 3 for exit");
            DrawStarLine();
        }

        }
    }

最后一点:你的应用程序(现在编程)只支持一名学生。我建议使用字典&gt;支持多个学生。您可以按学生的姓名键入词典中的每个条目,并将其信息存储为列表(就像您已经在做的那样)。

祝你好运,

克林顿