using WarmlyShip.DrawningObjects; using WarmlyShip.MovementStrategy; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace WarmlyShip.Generics { /// /// Класс для хранения коллекции /// 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; } /// /// Сохранение информации по кораблям в хранилище в файл /// /// Путь и имя файла /// true - сохранение прошло успешно, false - ошибка при сохранении данных public void SaveData(string filename) { if (File.Exists(filename)) { File.Delete(filename); } StringBuilder data = new(); foreach (KeyValuePair> record in _shipStorages) { StringBuilder records = new(); foreach (DrawningShip? elem in record.Value.GetShips) { records.Append($"{elem?.GetDataForSave(_separatorForObject)}{_separatorRecords}"); } data.AppendLine($"{record.Key.Name}{_separatorForKeyValue}{records}"); } if (data.Length == 0) { throw new IOException("Невалидная операция, нет данных для сохранения"); } string toWrite = $"ShipStorage{Environment.NewLine}{data}"; var strs = toWrite.Split(new char[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries); using (StreamWriter sw = new(filename)) { foreach (var str in strs) { sw.WriteLine(str); } } } /// /// Загрузка информации по кораблям в хранилище из файла /// /// Путь и имя файла /// true - загрузка прошла успешно, false - ошибка при загрузке данных public void LoadData(string filename) { if (!File.Exists(filename)) { throw new IOException("Файл не найден"); } using (StreamReader sr = new(filename)) { string str = sr.ReadLine(); var strs = str.Split(new char[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries); if (strs == null || strs.Length == 0) { throw new IOException("Нет данных для загрузки"); } if (!strs[0].StartsWith("ShipStorage")) { throw new IOException("Неверный формат данных"); } _shipStorages.Clear(); do { string[] record = str.Split(_separatorForKeyValue, StringSplitOptions.RemoveEmptyEntries); if (record.Length != 2) { str = sr.ReadLine(); continue; } ShipsGenericCollection collection = new(_pictureWidth, _pictureHeight); 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)) { throw new IOException("Ошибка добавления в коллекцию"); } } } _shipStorages.Add(new ShipsCollectionInfo(record[0], string.Empty), collection); str = sr.ReadLine(); } while (str != null); } } /// /// Добавление набора /// /// Название набора public void AddSet(string name) { _shipStorages.Add(new ShipsCollectionInfo(name, string.Empty), new ShipsGenericCollection(_pictureWidth, _pictureHeight)); } /// /// Удаление набора /// /// Название набора public void DelSet(string name) { if (!_shipStorages.ContainsKey(new ShipsCollectionInfo(name, string.Empty))) { return; } _shipStorages.Remove(new ShipsCollectionInfo(name, string.Empty)); } /// /// Доступ к набору /// /// /// public ShipsGenericCollection? this[string ind] { get { ShipsCollectionInfo indObj = new ShipsCollectionInfo(ind, string.Empty); if (_shipStorages.ContainsKey(indObj)) { return _shipStorages[indObj]; } return null; } } } }