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

本文关键字:列表 检索 数据 控制台 应用 | 更新日期: 2023-09-27 18:37:06

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

我想从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();
        }
        }
    }

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

您必须在 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();
    }

您将列表声明为 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) 将在没有支持字段(私有变量)的情况下自动生成属性

对于初学者来说,你需要将当前在 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();
        }
        }
    }

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

祝你好运,

克林顿