using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ArmoredVehicle { /// /// Класс для хранения коллекции карт /// internal class MapsCollection { /// /// Словарь (хранилище) с картами /// readonly Dictionary> _mapStorages; /// /// Возвращение списка названий карт /// public List Keys => _mapStorages.Keys.ToList(); /// /// Ширина окна отрисовки /// private readonly int _pictureWidth; /// /// Высота окна отрисовки /// private readonly int _pictureHeight; /// /// Разделитель для записи информации по элементу словаря в файл /// private readonly char separatorDict = '|'; /// /// Разделитель для записей коллекции данных в файл /// private readonly char separatorData = ';'; /// /// Конструктор /// /// /// public MapsCollection(int pictureWidth, int pictureHeight) { _mapStorages = new Dictionary>(); _pictureWidth = pictureWidth; _pictureHeight = pictureHeight; } /// /// Добавление карты /// /// Название карты /// Карта public void AddMap(string name, AbstractMap map) { if (Keys.Contains(name)) { MessageBox.Show("Такая карта уже есть"); return; } else { var NewElem = new MapWithSetMachineGeneric( _pictureWidth, _pictureHeight, map); _mapStorages.Add(name, NewElem); } } /// /// Удаление карты /// /// Название карты public void DelMap(string name) { if (Keys.Contains(name)) { _mapStorages.Remove(name); } else { MessageBox.Show("Такой карты нет"); return; } } /// /// Доступ к парковке /// /// /// public MapWithSetMachineGeneric this[string ind] { get { if(Keys.Contains(ind)) { return _mapStorages[ind]; } MessageBox.Show("Такой карты нет"); return null; } } /// /// Сохранение информации по автомобилям в хранилище в файл /// /// Путь и имя файла /// public void SaveData(string filename) { if (File.Exists(filename)) { File.Delete(filename); } using (StreamWriter fs = new(filename)) { fs.Write($"MapsCollection{Environment.NewLine}"); foreach (var storage in _mapStorages) { fs.Write($"{storage.Key}{separatorDict}{storage.Value.GetData(separatorDict, separatorData)}{Environment.NewLine}"); } } } /// /// Загрузка нформации по автомобилям на парковках из файла /// /// /// public void LoadData(string filename) { if (!File.Exists(filename)) { throw new LoadFileException($"Файл {filename} не найден"); } string bufferTextFromFile = ""; using (StreamReader sr = new(filename)) { string checkMap = sr.ReadLine(); if (!checkMap.Contains("MapsCollection")) { throw new LoadFileException($"Неверный формат данных в файле {filename}"); } bufferTextFromFile = sr.ReadLine(); _mapStorages.Clear(); while (bufferTextFromFile != null) { var strs = bufferTextFromFile.Split(separatorDict); AbstractMap map = null; switch (strs[1]) { case "SimpleMap": map = new SimpleMap(); break; case "VertivalMap": map = new VerticalMap(); break; case "HorizontalMap": map = new HorizontalMap(); break; } _mapStorages.Add(strs[0], new MapWithSetMachineGeneric(_pictureWidth, _pictureHeight, map)); _mapStorages[strs[0]].LoadData(strs[2].Split(separatorData, StringSplitOptions.RemoveEmptyEntries)); bufferTextFromFile = sr.ReadLine(); } } } } }