using System; using System.Collections.Generic; using System.Diagnostics.Tracing; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Artilleries { internal class MapsCollection { readonly Dictionary> _mapsStorage; public List Keys => _mapsStorage.Keys.ToList(); private readonly int _pictureWidth; private readonly int _pictureHeight; private readonly char separatorDict = '|'; private readonly char separatorData = ';'; public MapsCollection(int pictureWidth, int pictureHeight) { _mapsStorage = new Dictionary>(); _pictureWidth = pictureWidth; _pictureHeight = pictureHeight; } public void AddMap(string name, AbstractMap map) { if (!_mapsStorage.ContainsKey(name)) { _mapsStorage.Add(name, new MapWithSetArtilleriesGeneric(_pictureWidth, _pictureHeight, map)); } } public void DelMap(string name) { if (_mapsStorage.ContainsKey(name)) { _mapsStorage.Remove(name); } } public MapWithSetArtilleriesGeneric this[string index] { get { return _mapsStorage.ContainsKey(index) ? _mapsStorage[index] : null; } } public void SaveData(string filename) { if (File.Exists(filename)) { File.Delete(filename); } using (FileStream fs = new FileStream(filename, FileMode.Create)) using (StreamWriter sw = new StreamWriter(fs, Encoding.UTF8)) { sw.WriteLine("MapsCollection"); foreach (var storage in _mapsStorage) { sw.WriteLine($"{storage.Key}{separatorDict}{storage.Value.GetData(separatorDict, separatorData)}"); } } } public void LoadData(string filename) { if (!File.Exists(filename)) { throw new FileNotFoundException("Файл не найден"); } using (FileStream fs = new FileStream(filename, FileMode.Open)) using (StreamReader sr = new StreamReader(fs, Encoding.UTF8)) { string current_line = sr.ReadLine(); if (current_line == null || !current_line.Contains("MapsCollection")) { throw new FileFormatException("Неверный формат файла"); } _mapsStorage.Clear(); while ((current_line = sr.ReadLine()) != null) { var elements = current_line.Split(separatorDict); AbstractMap map = null; switch (elements[1]) { case "SimpleMap": map = new SimpleMap(); break; case "ForestMap": map = new ForestMap(); break; } _mapsStorage.Add(elements[0], new MapWithSetArtilleriesGeneric(_pictureWidth, _pictureHeight, map)); _mapsStorage[elements[0]].LoadData(elements[2].Split(separatorData, StringSplitOptions.RemoveEmptyEntries)); } } } } }