возьмите один элемент из списка и импортируйте его в другой список

#c# #list

#c# #Список

Вопрос:

итак, короче говоря, я хочу взять отсутствующего человека и импортировать только этого одного человека в список отсутствующих, каждый раз, когда я пробовал это, он импортировал всех из списка студентов, так что это не очень помогает;

это делается для того, чтобы в самом конце я мог очистить и отобразить каждого ученика соответствующими цветами для их посещаемости, если они отсутствуют, они красные, а если они присутствовали, они зеленые

тай заранее 🙂

 using System.Collections.Generic;  namespace HelloWorld {  class Hello  {  static void Main(string[] args)  {  Listlt;stringgt; students = new Listlt;stringgt;(5);  students.Add("Obama Ojane");   students.Add("Yarik Ze");  students.Add("Allen O'neill");  students.Add("Naveen Sharma");  students.Add("Monica Rathbun");  students.Add("David McCarter");  students.Add("Zayne Pan");  students.Add("Rah");   int v = 0;  int abs = 0;  int pres = 0;   Listlt;stringgt; absent = new Listlt;stringgt;(5);  Listlt;stringgt; present = new Listlt;stringgt;(5);   foreach (string a in students)  {  Console.Write(students[v]   ": ");  string attendance = Console.ReadLine();  if (attendance == "absent" || attendance == "abs" || attendance == "a")  {  abs  ;   absent.Append(attendance);  String studentNameA = students[v];  absent.Add(studentNameA);  }  if (attendance == "present" || attendance == "pres" || attendance == "p")  {  pres  ;  present.Append(attendance);  String studentNameP = students[v];  absent.Add(studentNameP);   }  v  ;  }  Console.WriteLine();  Console.Clear();  Console.WriteLine("total present: "   pres);  Console.WriteLine("total absent: "   abs);  Console.WriteLine("total students: "   (abs pres));     Console.ForegroundColor = ConsoleColor.Red;  for (int i = 0; i lt; absent.Count; i  )  {  Console.WriteLine(absent[i]);  }   Console.ForegroundColor = ConsoleColor.Green;  for (int i = 0; i lt; present.Count; i  )  {  Console.WriteLine(present[i]);  }   }  } }  

Комментарии:

1. У вас совершенно очевидно absent.Add(studentNameP); , что в «настоящем» случае это не может быть правильным

2. Это хорошая возможность начать использовать отладчик. С помощью отладчика вы можете приостановить выполнение кода и пошагово выполнять его построчно, наблюдая за точным поведением во время выполнения и за тем, как ваши переменные меняются с каждой строкой кода. Когда вы это делаете, какая конкретная операция сначала приводит к неожиданному результату? Какие значения использовались в этой операции? Каков был результат? Какого результата ожидали? Почему?

Ответ №1:

Копирование Вставка-это зло: absent.Add(studentNameP); как нечестиво выразился в комментариях, это определенно проблема.

Давайте выполним рутину:

Мы начинаем с данных:

 // Keep it simple with a help of syntax sugar var students = new Listlt;stringgt;() {  "Obama Ojane",  "Yarik Ze",  "Allen O'neill",  "Naveen Sharma",  "Monica Rathbun",  "David McCarter",  "Zayne Pan",  "Rah", };  // avoid magic constants: what did 5 stand for?  var absent = new Listlt;stringgt;(students.Count); var present = new Listlt;stringgt;(students.Count);  

Затем мы добавляем пользовательский интерфейс, в котором мы назначаем студентов в absent или present :

 foreach(var student in students) {  // List (either present or absent) in which we add   Listlt;stringgt; list = null;   // Keep asking user until absent or present is selected  do {  Console.Write($"{student}: ");   string attendance = Console.ReadLine().Trim();   if (attendance == "absent" || attendance == "abs" || attendance == "a")  list = absent; // we add to absent  else if (attendance == "present" || attendance == "pres" || attendance == "p")  list = present; // we add to present  }  while (list == null);    list.Add(student); }  

Наконец, мы выводим:

 Console.Clear(); Console.WriteLine($"total present: {present.Count}"); Console.WriteLine($"total absent: {absent.Count}"); Console.WriteLine($"total students: {present.Count   absent.Count}");  Console.ForegroundColor = ConsoleColor.Red;  foreach (var student in absent)  Console.WriteLine(student);  Console.ForegroundColor = ConsoleColor.Green;  foreach (var student in present)  Console.WriteLine(student);   

Ответ №2:

Одна из ваших проблем заключается в том, что вы пытаетесь заставить один метод Main() делать слишком много. Если вы разбьете вещи на отдельные методы, каждый из которых делает что-то одно, все станет намного проще. Также легче понять:

 using System.Collections.Generic;  namespace HelloWorld {  class Hello  {  static void Main(string[] args)  {  Listlt;stringgt; students = new Listlt;stringgt;(new string[]{  "Obama Ojane",  "Yarik Ze",  "Allen O'neill",  "Naveen Sharma",  "Monica Rathbun",  "David McCarter",  "Zayne Pan",  "Rah",  });  Listlt;stringgt; absent = new Listlt;stringgt;();  Listlt;stringgt; present = new Listlt;stringgt;();   foreach (string student in students)  {  bool isPresent = getStatus(student);  if (isPresent)  {  present.Add(student);  }  else  {  absent.Add(student);  }  }   WriteSummary(present.Count, absent.Count, students.Count);  WriteReport(absent, "Absent", ConsoleColor.Red);  WriteReport(present, "Present", ConsoleColor.Green);   }   static void WriteSummary(int present, int absent, int total)  {  Console.Clear();  Console.WriteLine("total present: {0}", present);  Console.WriteLine("total absent: {0}", absent);  Console.WriteLine("total students: {0}", students);  }   static void WriteReport(Listlt;stringgt; students, string title, ConsoleColor color)  {  Console.WriteLine();  Console.WriteLine("{0}:", title);  Console.ForegroundColor = color;  foreach (var student in students)  {  Console.WriteLine(student);  }  }   static bool getStatus(string student)  {   // loop forever  while (true)  {   // prompt with the student's name  Console.Write("{0}: ", student);   // read the response  string status = Console.ReadLine();   // test the response  switch (status.ToLower())  {  case "a":  // student is absent  return false;  case "p":  // student is present  return true;  default:  // otherwise, the response is is incorrect/unknown.  // report the error and prompt again  Console.WriteLine("Please enter 'a' for absent or 'p' for present");  }   }   }   }  }