using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Lab1 { public class SubjectIndex : ISubjectIndex { Dictionary> _data; public SubjectIndex() { _data = new Dictionary>(); } public SubjectIndex(Dictionary> data) { _data = data; } // Геттеры и сеттеры для поля _data public Dictionary> Data { get { return _data; } set { _data = value; } } static SubjectIndex() { Console.WriteLine("Вызыван статический конструктор SubjectIndex"); } // Загрузка из клавиатуры public virtual void LoadFromKeyboard() { while (true) { Console.WriteLine("Введите слово:"); Console.WriteLine(".q - выйти"); Console.WriteLine(""); Console.Write("> "); string input = Console.ReadLine(); // Если input == ".q", то выходим из цикла if (input == ".q") break; if (input == "") { Console.WriteLine("Введена пустая строка!"); continue; } string key = input; // Проверяем, что _data содержит слово if (_data.ContainsKey(key)) { Console.WriteLine("Предметный указатель содержит данное слово!"); continue; } _data[key] = new List(); // Вводим номера страниц (максимум 10) while (_data[key].Count < 10) { Console.WriteLine("Введите номер страницы ({0}/10):", _data[key].Count + 1); Console.WriteLine(".q - выйти"); Console.WriteLine(""); Console.Write("> "); input = Console.ReadLine(); // Если input == ".q" выходим из цикла (выход из ввода страниц) if (input == ".q") break; int page; // Проверка на корректность ввода if (!int.TryParse(input, out page) || page <= 0) { Console.WriteLine("Некорректный ввод. Попробуйте еще раз."); continue; } // Добавляем номер страницы в список _data[key].Add(page); } } } // Загрузка из файла public virtual void LoadFromFile(string filename) { // Открываем файл System.IO.StreamReader file = new System.IO.StreamReader(filename); int lineNumber = 0; /* * Читаем построчно из файла и добавляем в словарь * Формат файла: слово и номера страниц, разделенные пробелом */ while (!file.EndOfStream) { lineNumber++; string line = file.ReadLine(); string[] parts = line.Split(' '); // Если массив parts пуст - выкидываем исключение if (parts.Length == 0) { throw new Exception("Строка пустая!"); } string key = parts[0]; // Если слово это пустая строка - выкидываем исключение if (key == "") { throw new Exception("Слово пустое!"); } // Если слово уже есть в словаре - выкидываем исключение if (_data.ContainsKey(key)) { throw new Exception("Предметный указатель содержит данное слово!"); } List value = new List(); int page; for (int i = 1; i < parts.Length; i++) { // Если parts[i] не является натуральным числом, то вызываем исключение if (!int.TryParse(parts[i], out page) || page <= 0) throw new Exception(String.Format("Некорректный формат файла! {0} - не является натуральным числом", parts[i])); // Добавляем страницу в список value.Add(page); } _data[key] = value; } } // Вывод указателя public virtual void Print() { string result = ""; foreach (KeyValuePair> kvp in _data) { result += String.Format("\"{0}\": [", kvp.Key, kvp.Value); result += (String.Join(", ", kvp.Value.ToArray())) + "]\n"; } Console.WriteLine(result); } // Вывод номеров страниц для заданного слова public virtual void PrintPages(string word) { Console.WriteLine(string.Join(", ", _data[word])); } // Удаление элемента из указателя public virtual void Delete(string word) { _data.Remove(word); } // Индексатор public List this[string word] { get { return _data[word]; } set { _data[word] = value; } } // Перечислитель public IEnumerator>> GetEnumerator() { // Итератор foreach (KeyValuePair> kvp in _data) { yield return kvp; } } // Переопределение метода ToString public override string ToString() { string result = "SubjectIndex: \n"; foreach (KeyValuePair> kvp in _data) { result += String.Format("\"{0}\": [", kvp.Key, kvp.Value); result += (String.Join(", ", kvp.Value.ToArray())) + "]\n"; } return result; } } }