/// <summary> /// Сортирует массив notes по значению одного из свойств класса Note /// </summary> /// <param name="fNote">"Псевдоним" свойства класса Note</param> /// <param name="order">Порядок сортировки</param> public void sortNotes(FieldsNote fNote = FieldsNote.DATE_NOTE, Order order = Order.ASC) { for (int i = 0; i < this.count; ++i) { for (int j = 0; j < this.count - 1; ++j) { if (isGreaterOneNote(ref notes[j], ref notes[j + 1], fNote, order)) { swapNotes(ref notes[j], ref notes[j + 1]); } } } }
// Идентификаторы записей (Id_Note) должны быть различным (в рамках одной программы). // Для этого при загрузке записей из файла ежедневника с совпадающими идентификаторами // они будут меняться (для исключения совпадения идентификаторов). /// <summary> /// Вывод главного меню программы /// </summary> static public void Menu() { int choice = 0; Notes notes = new Notes(); // создание пустого ежедневника do // бесконечный цикл (до выхода пользователя из программы) { do { Console.Clear(); Console.WriteLine("========================================================"); Console.WriteLine(" ГЛАВНОЕ МЕНЮ:"); Console.WriteLine("========================================================"); Console.WriteLine("1 - Добавить запись в ежедневник;"); Console.WriteLine("2 - Редактировать запись в ежедневнике;"); Console.WriteLine("3 - Удалить запись из ежедневника;"); Console.WriteLine("========================================================"); Console.WriteLine("4 - Загрузить данные из файла;"); Console.WriteLine("5 - Выгрузить данные в файл;"); Console.WriteLine("6 - Упорядочить записи в ежедневнике по выбранному полю;"); Console.WriteLine("========================================================"); Console.WriteLine("7 - Выйти из программы."); Console.WriteLine("========================================================"); Console.WriteLine(); Console.Write("Выберите пункт: "); int.TryParse(Console.ReadLine(), out choice); } while (choice < 1 || choice > 7); Console.Clear(); switch (choice) { case 1: // выбран пункт "Добавить запись" notes.prntNotes(); // выводим ежедневник (если есть записи) Console.Clear(); string whatFamily, whatName, whatSirname; DateTime whatBirthDate; string whatNotation; Mood whatMood = Mood.GOOD; // по умолчанию настроение хорошее Console.Write("Фамилия: "); whatFamily = Console.ReadLine(); Console.Write("Имя: "); whatName = Console.ReadLine(); Console.Write("Отчество: "); whatSirname = Console.ReadLine(); string sBDay; // вспомогательная переменная для конвертации в дату do { Console.Write("Дата рождения (формат - дд.мм.гггг): "); sBDay = Console.ReadLine(); if (!DateTime.TryParse(sBDay, out whatBirthDate)) { continue; // если дата рождения не является датой, то повторяем ввод } else { break; // если дата рождения корректна (является датой) то выходим из цикла } } while (true); // Создатель записи Person whatPerson = new Person(whatFamily, whatName, whatSirname, whatBirthDate); Console.Clear(); Console.Write("Напишите о настроении(плохое, хорошее, отличное): "); string strMood = Console.ReadLine(); if (strMood == "плохое") { whatMood = Mood.BAD; } else if (strMood == "отличное") { whatMood = Mood.GREAT; } Console.Clear(); Console.Write("Сделайте запись: "); whatNotation = Console.ReadLine(); Note note = new Note(whatNotation, whatPerson, whatMood); notes.insertNotes(note); continue; case 2: // выбран пункт "Редактировать запись" // если запсей в ежедневнике нет, то переходим к следующей итерации цикла if (!notes.prntNotes()) { continue; } uint id; // хранит идентификатор записи do { Console.WriteLine(); Console.Write("Введите номер идентификатора редактируемой записи (буква, или 0 - выход в меню): "); uint.TryParse(Console.ReadLine(), out id); if (id == 0) { break; } if (!notes.isNoteId(id)) { Console.WriteLine("Записи с таким идентификатором не существует!"); continue; } break; } while (true); if (id == 0) { continue; // пользователь выбрал выход, выводим меню } Console.Clear(); whatMood = notes.getNoteForId(id).Mood_Note; Console.Write("Настроение(плохое, хорошее, отличное): "); strMood = Console.ReadLine(); if (!String.IsNullOrEmpty(strMood)) { if (strMood == "плохое") { whatMood = Mood.BAD; } else if (strMood == "отличное") { whatMood = Mood.GREAT; } else { whatMood = Mood.GOOD; } } Console.Write("Сделайте запись: "); whatNotation = Console.ReadLine(); // Если пользователь ввел пустое поле, то не меняем текст записи if (String.IsNullOrEmpty(whatNotation)) { whatNotation = notes.getNoteForId(id).Notation_Note; } notes.editNotes(id, whatNotation, whatMood); // редактируем запись Console.Clear(); notes.prntNotes(); Console.ReadKey(); continue; case 3: // выбран пункт "Удалить запись" // если запсей в ежедневнике нет, то переходим к следующей итерации цикла if (!notes.prntNotes()) { continue; } do { Console.WriteLine(); Console.Write("Введите номер идентификатора удаляемой записи (буква, или 0 - выход в меню): "); uint.TryParse(Console.ReadLine(), out id); if (id == 0) { break; } if (!notes.isNoteId(id)) { Console.WriteLine("Записи с таким идентификатором не существует!"); continue; } break; } while (true); if (id == 0) { continue; // пользователь выбрал выход, выводим меню } notes.deleteNotes(id); // удаляем запись Console.Clear(); notes.prntNotes(); Console.ReadKey(); continue; case 4: // выбран пункт "Загрузить данные из файла" Console.Write("Введите путь к файлу для загрузки данных в ежедневник: "); string path = Console.ReadLine(); Console.Write("Загрузить данные по диапазону дат? (д/н): "); string ch = Console.ReadLine(); Console.WriteLine(); if (ch == "д") { DateTime from, to; // для обозначения промежутка дат Console.Write("Загружаем с (дата в формате дд.мм.гггг чч:ММ:сс): "); DateTime.TryParse(Console.ReadLine(), out from); Console.Write("Загружаем по (дата в формате дд.мм.гггг чч:ММ:сс): "); DateTime.TryParse(Console.ReadLine(), out to); notes.loadNotes(path, from, to); } else { notes.loadNotes(path); } continue; case 5: // выбран пункт "Выгрузить данные в файл" // если запсей в ежедневнике нет, то переходим к следующей итерации цикла if (!notes.prntNotes()) { continue; } Console.WriteLine(); Console.Write("Введите путь к файлу ежедневника (по умолчанию создастся файл Diary.diary в директории программы): "); path = Console.ReadLine(); notes.unloadNotes(path); continue; case 6: // выбран пункт "Упорядочить записи" int chFie; // выбор поля сортировки do { Console.Clear(); Console.WriteLine("============================="); Console.WriteLine("Поля записи:"); Console.WriteLine("============================="); Console.WriteLine("1 - Идентификатор записи;"); Console.WriteLine("2 - Дата создания записи;"); Console.WriteLine("3 - Текст записи;"); Console.WriteLine("4 - Создатель записи;"); Console.WriteLine("5 - Настроение;"); Console.WriteLine("============================="); Console.WriteLine(); Console.Write("Выберите поле по которому будем сортировать: "); int.TryParse(Console.ReadLine(), out chFie); } while (chFie < 1 || chFie > 5); Console.Write("Отсортировать в обратном порядке? (д/н): "); string chOrd = Console.ReadLine(); FieldsNote field = FieldsNote.DATE_NOTE; // поле по которому будем сортировать (по умолчанию - дата создания записи) Order order; if (chOrd == "д") { order = Order.DESC; } else { order = Order.ASC; } switch (chFie) { case 1: // сортировка по Id field = FieldsNote.ID_NOTE; break; case 2: // сортировка по дате создания field = FieldsNote.DATE_NOTE; break; case 3: // сортировка по тексту записи field = FieldsNote.NOTATION_NOTE; break; case 4: // сортировка по создателю записи field = FieldsNote.WRITER_NOTE; break; case 5: // сортировка по настроению field = FieldsNote.MOOD_NOTE; break; case 6: // вернуться в главное меню continue; } notes.sortNotes(field, order); continue; case 7: // выбран пункт "Выйти" return; } } while (true); }
/// <summary> /// Определяет больше ли первый объект второго /// </summary> /// <param name="oneNote">Первый объект сравнения</param> /// <param name="twoNote">Второй объект сравнения</param> /// <param name="fn">Поле по которому происходит сравнение</param> /// <param name="order">Порядок сортировки (по возрастанию, по убыванию)</param> /// <returns>true - если oneNote > twoNote</returns> private static bool isGreaterOneNote(ref Note oneNote, ref Note twoNote, FieldsNote fn, Order order) { // Переменные для сравнения строковых значений полей string fieldStrVal1 = String.Empty; string fieldStrVal2 = String.Empty; // Получение значений свойств объектов if (fn == FieldsNote.NOTATION_NOTE) { fieldStrVal1 = oneNote.Notation_Note; fieldStrVal2 = twoNote.Notation_Note; } else if (fn == FieldsNote.WRITER_NOTE) { fieldStrVal1 = oneNote.Writer_Note.personToString(); fieldStrVal2 = twoNote.Writer_Note.personToString(); } // Если порядок сортировки прямой if (order == Order.ASC) { if (String.Compare(fieldStrVal1, fieldStrVal2, true) == 1) { return(true); } } else // если порядок сортировки обратный { if (String.Compare(fieldStrVal1, fieldStrVal2, true) == -1) { return(true); } } ////////////////////////////СРАВНЕНИЕ СВОЙСТВ Mood_Note, Id_Note, Date_Note/////////////////////////// if (fn == FieldsNote.MOOD_NOTE) { uint fieldMoodVal1 = (uint)oneNote.Mood_Note; uint fieldMoodVal2 = (uint)twoNote.Mood_Note; // если порядок сортировки прямой if (order == Order.ASC) { return(fieldMoodVal1 > fieldMoodVal2); } else { return(fieldMoodVal1 < fieldMoodVal2); // если порядок обратный } } if (fn == FieldsNote.ID_NOTE) { uint fieldIdVal1 = oneNote.Id_Note; uint fieldIdVal2 = twoNote.Id_Note; // если порядок сортировки прямой if (order == Order.ASC) { return(fieldIdVal1 > fieldIdVal2); } else { return(fieldIdVal1 < fieldIdVal2); // если порядок обратный } } if (fn == FieldsNote.DATE_NOTE) { DateTime fieldDTVal1 = oneNote.Date_Note; DateTime fieldDTVal2 = twoNote.Date_Note; // если порядок сортировки прямой if (order == Order.ASC) { return(fieldDTVal1 > fieldDTVal2); } else { return(fieldDTVal1 < fieldDTVal2); // если порядок обратный } } //////////////////////КОНЕЦ_СРАВНЕНИЕ СВОЙСТВ Mood_Note, Id_Note, Date_Note////////////////////////////// return(false); // в остальных случаях возвращаем false }