从控制台应用中的列表检索数据
本文关键字:列表 检索 数据 控制台 应用 | 更新日期: 2023-09-27 18:37:06
我正在编写一个控制台应用程序,教师可以使用它来保存和检索有关学生的数据。
我想从studentInfoName
和studentInfoClassAndNumber
列表中检索元素 - 以便用户可以输入学生的姓名并获取所有其他信息,如中间名、姓氏、班级和号码。
我尝试使用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();
}
}
}
最后一点:您的应用程序(现在已编程)将仅支持一名学生。我建议使用字典>来支持多个学生。您可以按学生的姓名键入词典中的每个条目,并将他们的信息存储为列表(就像您已经在做的那样)。
祝你好运,
克林顿