/// <summary> /// Изменяет текущую заметку, т.е. помещает на верх стека новые заголовок и текст /// </summary> /// <param name="newTitle"></param> /// <param name="newText"></param> public void ChangeNote(string newTitle, string newText) { BaseNote newNote = new BaseNote(newTitle, newText); // заметка хранит до 10 последних изменений, включая текущее видимое значение if (this.noteStack.Count == 10) { // удаляем самый глубокий элемент // К сожалению, нет метода, удаляющего самый первый элемент стека, // хотя реализовать его проще простого - просто отсекаешь последний эл-т массива, // через который реализован стек. BaseNote[] tempArr = noteStack.ToArray(); // Поэтому просто копируем стек в массив, noteStack.Clear(); // очищаем стек for (int i = tempArr.Length - 2; i >= 0; i--) // а потом запихиваем назад в стек { noteStack.Push(tempArr[i]); // все эл-ты, кроме первого (посл. в массиве) } } this.noteStack.Push(newNote); SimpleDateTime newChangeDT = new SimpleDateTime(DateTime.Now); this.ChangeDT = newChangeDT; }
public KeyStruct(SimpleDateTime dt, uint id) { this.Year = (short)dt.Year; this.Month = (sbyte)dt.Month; this.Day = (sbyte)dt.Day; this.Hour = (sbyte)dt.Hour; this.Min = (sbyte)dt.Min; this.ID = id; }
/// <summary> /// Редактирует текущую запись - меняет заголовок и текст /// </summary> /// <param name="keyDT">Ключ записи. Включает в себя дату и время записи</param> /// <param name="newTitle">Новый заголовок</param> /// <param name="newText">Новый текст</param> public void EditNoteContent(KeyStruct keyDT, string newTitle, string newText) { BaseNote noteToEdit = Organizer[keyDT.Year][keyDT.Month][keyDT.Day].Day[keyDT].noteStack.Peek(); noteToEdit.Title = newTitle; noteToEdit.Text = newText; Organizer[keyDT.Year][keyDT.Month][keyDT.Day].Day[keyDT].noteStack.Push(noteToEdit); SimpleDateTime changeDT = new SimpleDateTime(DateTime.Now); Organizer[keyDT.Year][keyDT.Month][keyDT.Day].Day[keyDT].ChangeDT = changeDT; }
/// <summary> /// Добавляет в ежедневник запись в конкретную дату и время, с заданными типом, заголовком и текстом. /// При добавлении генерирует уникальный ID записи. /// </summary> /// <param name="displayDT">Дата и время, в которое показана запись</param> /// <param name="title">Заголовок записи</param> /// <param name="text">Текст записи</param> /// <param name="typeOfNote">Тип записи - заметка, событие или дело</param> public void AddNote(SimpleDateTime displayDT, string title, string text, TypeOfNote typeOfNote, bool wDayOrDone, // флаг весь день - событие, сделано - дело bool star) // флаг приоритета для дела { short currYear = displayDT.Year; sbyte currMon = displayDT.Month; sbyte currDay = displayDT.Day; DayClass dayToAdd; KeyStruct keyDT; Note newNote; // Проверка, выделена ли память для этой даты // Инициализирован ли год? if (!Organizer.ContainsKey(currYear)) { YearClass yearToAdd = new YearClass(currYear); Organizer.Add(currYear, yearToAdd); } // Инициализирован ли месяц для этой даты? if (Organizer[currYear][currMon] == null) { Organizer[currYear].CreateMonth(currMon); } // Инициализирован ли день? if (Organizer[currYear][currMon][currDay] == null) { Organizer[currYear].CreateDay(currMon, currDay); // создаём новый день dayToAdd = Organizer[currYear][currMon][currDay]; // присваиваем ради сокращения записи Count++; keyDT = new KeyStruct(displayDT, ++IDcounter); switch (typeOfNote) { case TypeOfNote.Note: newNote = new Note(keyDT, title, text); dayToAdd.AddNote(keyDT, newNote); return; case TypeOfNote.Event: newNote = new Note(keyDT, title, text, wDayOrDone); dayToAdd.AddNote(keyDT, newNote); return; case TypeOfNote.ToDo: newNote = new Note(keyDT, title, text, wDayOrDone, star); dayToAdd.AddNote(keyDT, newNote); return; default: Console.WriteLine("Unknown type of a record!!!"); break; } } // Если пришли сюда, значит в этом дне уже есть запись(и) dayToAdd = Organizer[currYear][currMon][currDay]; // Существует ли уже запись с такими же временем, типом, заголовком, текстом? // // Если существует и полностью всё совпадает - то значит, мы просто ничего не добавляем // Если совпадает дата, но время отличается - добавляем // Если совпадает дата и время, но тип отличается - добавляем // Если совпадает дата и время, и тип, но заголовок и/или текст заметки оличается - добавляем // Если совпадает дата и время, и тип, и заголовок с текстом, - не добавляем. foreach (var e in dayToAdd.Day) { if (e.Value.DisplayDT.Hour == displayDT.Hour) // Запись с таким временем { if (e.Value.DisplayDT.Min == displayDT.Min) // уже существует? { if (e.Value.TypeOfNote == typeOfNote) // Тип совпадает? { if (e.Value.noteStack.Peek().Title == title) // Заголовок и текст записи { if (e.Value.noteStack.Peek().Text == text) // совпадает? { return; // ничего не добавляем!!! Такая заметка уже есть!!! } } } } } } // Специально сделал несколько if-ов, а не составное выражение выр1 & выр2 & выр3 // Потому что в логическом выражении вычисляются обе части выражения, // а сравнение текста - это оч. долго Count++; keyDT = new KeyStruct(displayDT, ++IDcounter); switch (typeOfNote) { case TypeOfNote.Note: newNote = new Note(keyDT, title, text); dayToAdd.AddNote(keyDT, newNote); return; case TypeOfNote.Event: newNote = new Note(keyDT, title, text, wDayOrDone); dayToAdd.AddNote(keyDT, newNote); return; case TypeOfNote.ToDo: newNote = new Note(keyDT, title, text, wDayOrDone, star); dayToAdd.AddNote(keyDT, newNote); return; } }
static void Main(string[] args) { Random r = new Random(); short rYear; sbyte rMonth; // 1 - 12 sbyte rDay; // 1 - 31 sbyte rHour; sbyte rMin; sbyte rSec; TypeOfNote rTypeOfNote; // 0, 1, 2 string rTitle = "Title_"; string rText = "Text"; bool rFlag; // Флажок для типов записи событие (1) или дело (2) bool rStar; SimpleDateTime rDT; OrganizerClass myOrganizer = new OrganizerClass(); for (int i = 0; i < 365; i++) { rYear = (short)r.Next(1998, 2003); rMonth = (sbyte)r.Next(1, 13); if (rYear == 2000 & rMonth == 2) { rDay = (sbyte)r.Next(1, 30); // високосный февраль } else { rDay = (sbyte)r.Next(1, YearClass.monthsLength[rMonth] + 1); } rHour = (sbyte)r.Next(1, 24); rMin = (sbyte)r.Next(1, 60); rSec = (sbyte)r.Next(1, 60); rTypeOfNote = (TypeOfNote)r.Next(0, 3); rTitle = $"Title_{rYear}{rMonth}{rDay}_{rHour}:{rMin}:{rSec}"; rText = $"This is the day {rDay} of month {rMonth} of the year {rYear}." + $" Time now is {rHour} hours {rMin} minutes {rSec} seconds. Aju!"; rFlag = r.Next(0, 2) == 1 ? true : false; rStar = r.Next(0, 2) == 1 ? true : false; rDT = new SimpleDateTime(rYear, rMonth, rDay, rHour, rMin); myOrganizer.AddNote(rDT, rTitle, rText, rTypeOfNote, rFlag, rStar); } foreach (var yyyy in myOrganizer.Organizer) // Берём по порядку все годы из ежедневника // myOrganizer.Organizer это SortedList<short,YearClass> // yyyy это KeyValuePair < short, YearClass > - значит из yyyy надо взять год // год - это yyyy.Value // а из года все месяцы { foreach (DayClass[] mm in yyyy.Value.year) // Берём по порядку все месяцы из года // yyyy.Value.year - это DayClass[][] // mm - это месяц, т.е. yyyy.Value.year[] { if (mm == null) { continue; // т.к. мы нумеруем месяцы с 1, то 0-й элемент равен null } // или если месяц не инициализирован, т.е. в нём нет ни одной записи // надо его пропустить foreach (DayClass dd in mm) // Берём по порядку все дни // dd - это день! { if (dd == null) { continue; // т.к. мы нумеруем дни с 1, то 0-й элемент равен null } // или если день не инициализирован, т.е. в нём нет ни одной записи // надо его пропустить foreach (var record in dd.Day) { string printDT = record.Value.DisplayDT.ToStringWithID(); Console.WriteLine($"Date: {printDT}"); Console.WriteLine($"{record.Value.noteStack.Peek().Title}"); Console.WriteLine($"{record.Value.noteStack.Peek().Text}"); Console.WriteLine(); } } } } Console.WriteLine($"Total records in the organizer: {myOrganizer.Count}"); Console.WriteLine($"Last ID generated: {myOrganizer.IDcounter}"); }