using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using ContainerShip.MovementStrategy; using ContainerShip.DrawningObjects; using ContainerShip.Entities; namespace ContainerShip.Generic { internal class ShipsGenericStorage { //Словарь (хранилище) readonly Dictionary> _shipStorages; //Возвращение списка названий наборов public List Keys => _shipStorages.Keys.ToList(); //Ширина окна отрисовки private readonly int _pictureWidth; //Высота окна отрисовки private readonly int _pictureHeight; // Разделитель для записи ключа и значения элемента словаря private static readonly char _separatorForKeyValue = '|'; // Разделитель для записей коллекции данных в файл private readonly char _separatorRecords = ';'; // Разделитель для записи информации по объекту в файл private static readonly char _separatorForObject = ':'; public ShipsGenericStorage(int pictureWidth, int pictureHeight) { _shipStorages = new Dictionary>(); _pictureWidth = pictureWidth; _pictureHeight = pictureHeight; } // Добавление набора public void AddSet(string name) { ShipsCollectionInfo set = new ShipsCollectionInfo(name, string.Empty); if (_shipStorages.ContainsKey(set)) return; _shipStorages.Add(set, new ShipsGenericCollection(_pictureWidth, _pictureHeight)); } // Удаление набора public void DelSet(string name) { ShipsCollectionInfo set = new ShipsCollectionInfo(name, string.Empty); // проверка, что нет набора с таким именем if (!_shipStorages.ContainsKey(set)) return; _shipStorages.Remove(set); } // Доступ к набору public ShipsGenericCollection? this[string ind] { get { ShipsCollectionInfo set = new ShipsCollectionInfo(ind, string.Empty); if (!_shipStorages.ContainsKey(set)) { return null; } return _shipStorages[set]; } } // Сохранение информации по автомобилям в хранилище в файл public bool SaveData(string filename) { if (_shipStorages.Count == 0) { throw new InvalidOperationException("Невалидная операция, нет данных для сохранения"); } if (File.Exists(filename)) { File.Delete(filename); } using (StreamWriter sw = File.CreateText(filename)) { sw.WriteLine($"ShipStorage"); foreach (var record in _shipStorages) { StringBuilder records = new(); if (record.Value.count <= 0) { throw new InvalidOperationException("Невалидная операция, нет данных для сохранения"); } foreach (DrawningShip? elem in record.Value.GetShip) { records.Append($"{elem?.GetDataForSave(_separatorForObject)}{_separatorRecords}"); } sw.WriteLine($"{record.Key}{_separatorForKeyValue}{records}"); } } return true; } // Загрузка информации по автомобилям в хранилище из файла public bool LoadData(string filename) { if (!File.Exists(filename)) { throw new FileNotFoundException($"Файл {filename} не найден"); } using (StreamReader sr = File.OpenText(filename)) { // 1-ая строка string? curLine = sr.ReadLine(); // пустая или не те данные if (curLine == null || curLine.Length == 0 || !curLine.StartsWith("ShipStorage")) { throw new ArgumentException("Неверный формат данных"); } // очищаем _shipStorages.Clear(); // загружаем данные построчно curLine = sr.ReadLine(); if (curLine == null || curLine.Length == 0) { throw new ArgumentException("Нет данных"); } while (curLine != null) { // загружаем запись if (!curLine.Contains(_separatorRecords)) { throw new ArgumentException("Коллекция пуста"); } string[] record = curLine.Split(_separatorForKeyValue, StringSplitOptions.RemoveEmptyEntries); // загружаем набор ShipsGenericCollection collection = new(_pictureWidth, _pictureHeight); // record[0] - название набора, record[1] - куча объектов string[] set = record[1].Split(_separatorRecords, StringSplitOptions.RemoveEmptyEntries); foreach (string elem in set) { DrawningShip? ship = elem?.CreateDrawningShip(_separatorForObject, _pictureWidth, _pictureHeight); // проверяем, не переполнится ли коллекция if (ship != null) { if (collection + ship == -1) { throw new InvalidOperationException("Невалидная операция, ошибка добавления в коллекцию"); } } } _shipStorages.Add(new ShipsCollectionInfo(record[0], string.Empty), collection); curLine = sr.ReadLine(); } } return true; } } }