using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using DumpTruck.DrawingObjects; using DumpTruck.MovementStrategy; namespace DumpTruck.Generics { /// /// Класс для хранения коллекции /// internal class TrucksGenericStorage { /// /// Разделитель для записи ключа и значения элемента словаря /// private static readonly char _separatorForKeyValue = '|'; /// /// Разделитель для записей коллекции данных в файл /// private readonly char _separatorRecords = ';'; /// /// Разделитель для записи информации по объекту в файл /// private static readonly char _separatorForObject = ':'; /// /// Словарь (хранилище) /// readonly Dictionary> _truckStorages; /// /// Возвращение списка названий наборов /// public List Keys => _truckStorages.Keys.ToList(); /// /// Ширина окна отрисовки /// private readonly int _pictureWidth; /// /// Высота окна отрисовки /// private readonly int _pictureHeight; /// /// Конструктор /// /// /// public TrucksGenericStorage(int pictureWidth, int pictureHeight) { _truckStorages = new Dictionary>(); _pictureWidth = pictureWidth; _pictureHeight = pictureHeight; } /// /// Добавление набора /// /// Название набора public void AddSet(string name) { if (!_truckStorages.ContainsKey(name)) _truckStorages.Add(name, new TrucksGenericCollection(_pictureWidth, _pictureHeight)); } /// /// Удаление набора /// /// Название набора public void DelSet(string name) { if (_truckStorages.ContainsKey(name)) _truckStorages.Remove(name); } /// /// Доступ к набору /// /// /// public TrucksGenericCollection? this[string ind] { get { if (_truckStorages.ContainsKey(ind)) return _truckStorages[ind]; return null; } } /// /// Сохранение информации по автомобилям в хранилище в файл /// /// Путь и имя файла /// true - сохранение прошло успешно, false - ошибка при сохранении данных public bool SaveData(string filename) { if (File.Exists(filename)) { File.Delete(filename); } StringBuilder data = new(); foreach (KeyValuePair> record in _truckStorages) { StringBuilder records = new(); foreach (DrawingTruck? elem in record.Value.GetTrucks) { records.Append($"{elem?.GetDataForSave(_separatorForObject)}{_separatorRecords}"); } data.AppendLine($"{record.Key}{_separatorForKeyValue}{records}"); } if (data.Length == 0) { return false; } using StreamWriter sw = new(filename); sw.Write($"TruckStorage{Environment.NewLine}{data}"); return true; } /// /// Загрузка информации по автомобилям в хранилище из файла /// /// Путь и имя файла /// true - загрузка прошла успешно, false - ошибка при загрузке данных public bool LoadData(string filename) { if (!File.Exists(filename)) { return false; } using (StreamReader sr = new(filename)) { string str = sr.ReadLine(); if (str == null || str.Length == 0) { return false; } if (!str.StartsWith("TruckStorage")) { return false; } _truckStorages.Clear(); while ((str = sr.ReadLine()) != null) { string[] record = str.Split(_separatorForKeyValue, StringSplitOptions.RemoveEmptyEntries); if (record.Length != 2) { continue; } TrucksGenericCollection < DrawingTruck, DrawningObjectTruck > collection = new(_pictureWidth, _pictureHeight); string[] set = record[1].Split(_separatorRecords, StringSplitOptions.RemoveEmptyEntries); foreach (string elem in set) { DrawingTruck? truck = elem?.CreateDrawingTruck(_separatorForObject, _pictureWidth, _pictureHeight); if (truck != null) { if (collection + truck == -1) { return false; } } } _truckStorages.Add(record[0], collection); } } return true; } } }