@Stazhor

Почему не добавляет элемент в список?

Стоит задача - добавить пользовательские данные в поля класса, а затем сам объект класса в список.
public List<Meetings> meet = new List<Meetings>();

        public void CreateMeet()
        {
            Console.WriteLine("Введите дату встречи:");
            string dateMeeting = Console.ReadLine();
            Console.WriteLine("Введите время начала встречи:");
            string startMeeting = Console.ReadLine();
            Console.WriteLine("Введите время конца встречи:");
            string endMeeting = Console.ReadLine();

            meet.Add(new Meetings { DateMeeting = dateMeeting, StartMeeting = startMeeting, EndMeeting = endMeeting});

            Console.WriteLine("Встреча добавлена! \n");


Но при просмотре содержимого через другой метод, ничего не выводит.
public void ShowMeetings()
        {
            foreach (Meetings meet in meet)
            {
                Console.WriteLine($"Дата встречи: {meet.DateMeeting}, Начало встречи: {meet.StartMeeting}, Конец встречи: {meet.EndMeeting}");
            }
            Console.WriteLine();
         }


И вот вопрос: Я что-то делаю неправильно на этапе добавления экземпляра класса Meetings в список, или когда вывожу его через foreach? Пробовал на уровне кода добавить в список объект класса, добавляется и выводится удачно. Вот код:
meet.Add(new Meetings { DateMeeting = "2019-01-21", StartMeeting = "12:31", EndMeeting = "12:32" });
            foreach (Meetings meet in meet)
            {
                Console.WriteLine($"Дата встречи: {meet.DateMeeting}, Начало встречи: {meet.StartMeeting}, Конец встречи: {meet.EndMeeting}");
            }


Помогите разобраться)
  • Вопрос задан
  • 326 просмотров
Решения вопроса 1
FoggyFinder
@FoggyFinder
Как уже правильно указали, проблема состоит в том, что вы каждый раз создаете новый экземпляр ManagerMeeting:

public void Route(string answer)
{
    var manager = new ManagerMeeting();


Также оставлю несколько комментариев по поводу кода:

1. Наследование применяете неправильно.

2. Если в сеттерах свойств нет дополнительной проверки на корректность значений полей, то лучше использовать авто-свойства.

3. Слишком сложная структура - классы Menu, Route кажутся избыточными. Для таких простых сценариев методы перечисленных классов проще перенести в Program.

4. Класс ManagerMeeting слишком сильно связан с консолью, кроме того есть зависимость от Menu. Если хотите предоставить методы для управления коллекцией (список встреч), то выставите необходимые методы и уже работайте с ними.

5. Для форматированного вывода собственных классов удобно переопределить метод .ToString()

Немного переписанные классы с учетом указанного выше:

class Meetings // Класс встреч
    {
        public string DateMeeting { get; set; }
        public string StartMeeting { get; set; }
        public string EndMeeting { get; set; }

        public override string ToString()
        {
            return $"Дата встречи: {DateMeeting}, Начало встречи: {StartMeeting}, Конец встречи: {EndMeeting}";
        }
    }

    class ManagerMeeting //  Класс управление встречами
    {
        public List<Meetings> MeetingList { get; } = new List<Meetings>();
        public void Add(Meetings meet)
        {
            MeetingList.Add(meet);
        }
        public string FormatMeetings()
        {
            StringWriter sw = new StringWriter();
            foreach (var meet in MeetingList)
                sw.WriteLine(meet);
            return sw.ToString();
        }  
    }


меню:

class Program
    {
        static ManagerMeeting manager = new ManagerMeeting();
        public static void ShowMainMenu()
        {
            Console.WriteLine("Выберите действие: \n1. Показать все встречи\n2. Создать новую встречу");
        }

        public static bool Handler()
        {
            Console.Clear();
            ShowMainMenu();
            string answer = Console.ReadLine();
            switch (answer)
            {
                case "1":
                    var result = manager.FormatMeetings();
                    if (string.IsNullOrWhiteSpace(result))
                        Console.WriteLine("Список пуск");
                    else
                        Console.WriteLine(manager.FormatMeetings());
                    return true;
                case "2":
                    manager.Add(ReadMeeting());
                    return true;
                default:
                    return false;
            }
        }

        public static void Main(string[] args)
        {
            while (Handler()) Console.ReadKey(true);
            Console.ReadKey(true);
        }

        public static Meetings ReadMeeting()
        {
            Console.WriteLine("Введите дату встречи:");
            var date = Console.ReadLine();
            Console.WriteLine("Введите время начала встречи:");
            var startMeeting = Console.ReadLine();
            Console.WriteLine("Введите время конца встречи:");
            var endMeeting = Console.ReadLine();

            Console.WriteLine("Встреча добавлена! \n ");
            //Для проверки, записываются ли поля - записываются
            Console.WriteLine(date + startMeeting + endMeeting);
            return new Meetings
            {
                DateMeeting = date,
                StartMeeting = startMeeting,
                EndMeeting = endMeeting
            };
        }
    }


Конечно, код выше тоже далек от идеального (всегда есть что улучшать). Например,:

Предусмотрите проверку данных:

В считывания информации с консоли:
* используйте типы данных которые лучше всего подходят для описания свойств (DateTime для даты и времени вместо универсального string)
* напишите вспомогательные методы GetInteger, GetDateTime и другие которые будут возвращать результат только после того как пользователь ввел корректные данные.

В классе ManagerMeeting:

* Пусть вместо void метод Add -возвращает bool в зависимости от успешности добавления (например, чтобы предусмотреть сценарии добавления давно прошедшей встречей).

И так далее.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
lexxpavlov
@lexxpavlov
Программист, преподаватель
Вероятно, вы где-то пересоздаёте список meet. Поставьте readonly на поле meet (а ещё лучше, переименовать её на MeetingsList)
public readonly List<Meetings> MeetingsList = new List<Meetings>();

Это предотвратит случайное перезаписание переменной.

>foreach (Meetings meet in meet)
Тут ошибка в коде, нельзя создать переменную-счётчик цикла Meetings meet, потому что переменная с именем meet уже есть. Если ошибка здесь не возникает, то, скорее всего, в какой-то из двух имён вместо английской "e" стоит русская "е".
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы