#c# #collections #console
#c# #Коллекции #консоль
Вопрос:
У меня возникают некоторые проблемы следующим образом: когда я добавляю нового пользователя, это работает нормально, но когда я добавляю второго пользователя, он забывает первого. Он продолжает забывать предыдущего пользователя, добавленного перед ним. Вот код:
static List<Students> stud = new List<Students>();
static Courses regcor = new Courses(0,"");
static void Main(string[] args)
{
Students regstud = new Students("", "", "", 0);
string idselec = "";
string selec = "";
do
{
Console.WriteLine("1.Register new student.");
Console.WriteLine("2.Add course.");
Console.WriteLine("3.All information.");
Console.WriteLine("4.Exit.");
selec = Console.ReadLine();
if (selec == "1")
{
do
{
Console.Clear();
Console.WriteLine("Enter ID");
idselec = Console.ReadLine();
if (checkid(idselec))
{
Console.WriteLine("Id already excsists");
Console.ReadLine();
}
}
while (checkid(idselec));
regstud.ID = idselec;
Console.WriteLine("Enter Name");
regstud.name = Console.ReadLine();
Console.WriteLine("Enter Surname");
regstud.surname = Console.ReadLine();
Console.WriteLine("Enter Age");
regstud.age = Convert.ToInt32(Console.ReadLine());
stud.Add(regstud);
}
else if (selec == "2")
{
Console.WriteLine("Enter ID");
idselec = Console.ReadLine();
check(idselec);
}
else if (selec == "3")
{
Console.Clear();
writeall();
}
}
while (selec != "4");
}
static bool checkid(string id)
{
return stud.Any(u => u.ID == id);
}
static void check(string ID)
{
int i = 0;
bool found = false;
do
{
if (stud[i].ID == ID )
{
Console.WriteLine("Hello " stud[i].name " " stud[i].surname) ;
Console.WriteLine("Enter code");
int code =Convert.ToInt32( Console.ReadLine());
Console.WriteLine("Enter Name");
string name = Console.ReadLine();
regcor.CourID = code;
regcor.courname = name;
stud[i].cour(regcor);
found = true;
}
i ;
}
while ((i < stud.Count) amp;amp; !(found));
}
static void writeall()
{
int i = 0, y=0, sub=0,sub3=0;
string sub2="";
do
{
Console.WriteLine(stud[i].ID);
Console.WriteLine(stud[i].name);
Console.WriteLine(stud[i].surname);
Console.WriteLine(stud[i].age);
sub3 = stud[i].cour3();
do
{
sub = stud[i].cour1(y);
sub2 = stud[i].cour2(y);
Console.WriteLine(sub);
Console.WriteLine(sub2);
y ;
}
while (y < sub3);
i ;
}
while (i < stud.Count);
}
}
}
Это курсы класса:
public int CourID = 0;
public string courname = "";
public Courses(int corID, string corname)
{
this.CourID = corID;
this.courname = corname;
}
}
}
Это студенты класса;
public int age = 0;
public string name = "", surname = "", ID = "";
List<Courses> cours = new List<Courses>();
public Students(string name, string surname,string ID, int age)
{
this.ID = ID;
this.surname = surname;
this.age = age;
this.name = name;
}
public void cour(Courses c)
{
cours.Add(c);
}
public int cour1(int i)
{
return cours[i].CourID;
}
public string cour2(int i)
{
return cours[i].courname;
}
public int cour3()
{
return cours.Count;
}
}
}
Комментарии:
1. Я не уверен, что тег database здесь полезен. Вы делаете все в памяти, нет? Использование тега database приведет людей, которые могут ответить на вопросы такого типа, и я не понимаю, как это возможно.
Ответ №1:
В настоящее время вы создаете только одного студента, затем перезаписываете его свойства
Переместите это:
Students regstud = new Students("", "", "", 0);
в ваш цикл do, где вы фактически создаете нового студента:
if (selec == "1")
{
Students regstud = new Students("", "", "", 0);
...
}
Еще лучше было бы создать объект Student только после того, как у вас будут готовы все его свойства:
if (selec == "1")
{
...
Console.WriteLine("Enter Name");
string name = Console.ReadLine();
Console.WriteLine("Enter Surname");
string surname = Console.ReadLine();
Console.WriteLine("Enter Age");
int age = Convert.ToInt32(Console.ReadLine());
Students regstud = new Students(name, surename, id, age);
...
}
Кроме того, для меня ваш код выглядит как комбинация Stone Age и Futurama: вы используете архаичные циклические конструкции с отдельными индексными переменными, с одной стороны, а затем generics и LINQ с другой. Старайтесь придерживаться более высоких абстракций, насколько это возможно — большинства переменных цикла, которые вы используете, можно избежать, если вы используете ForEach()
etc — это сделает ваш код намного чище и проще для чтения.
Комментарии:
1. о, хорошо, спасибо, и я только начал c # 3 месяца назад, мне 16 лет 🙂