#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"); } } } } }