using System.Text; using ProjectCruiser.DrawningSamples; namespace ProjectCruiser.CollectionGenericObj; public class StorageCollection where T : DrawningBase { // Разделитель для записи ключа и значения элемента словаря private readonly string _separatorForKeyValue = "|"; // Разделитель для записей коллекции данных в файл private readonly string _separatorItems = ";"; // Ключевое слово, с которого должен начинаться файл private readonly string _collectionKey = "CollectionsStorage"; // Словарь (хранилище) с коллекциями < name, type (class) > readonly Dictionary> _storages; // Возвращение списка названий коллекций public List Keys => _storages.Keys.ToList(); public StorageCollection() { _storages = new Dictionary>(); } // Добавление коллекции в хранилище public void AddCollection(string name, CollectionType collType) { if (name == null || _storages.ContainsKey(name) || collType == CollectionType.None) { return; } ICollectionGenObj collection = CreateCollection(collType); _storages.Add(name, collection); /* switch (collType) { case CollectionType.List: _storages.Add(name, new ListGenObj()); break; case CollectionType.Array: _storages.Add(name, new ArrayGenObj()); break; } */ } // Удаление коллекции ( по ключу-строке - её имени ) public void DelCollection(string name) { if (_storages.ContainsKey(name)) _storages.Remove(name); return; } // Доступ к коллекции ( по ключу-строке - её имени ) public ICollectionGenObj? this[string name] { get => _storages.ContainsKey(name) ? _storages[name] : null; } /// Сохранение информации по автомобилям в хранилище в файл /// Путь и имя файла /// true - сохранение прошло успешно, /// false - ошибка при сохранении данных public bool SaveData(string filename) { if (_storages.Count == 0) { return false; } if (File.Exists(filename)) { File.Delete(filename); } StringBuilder sb = new(); sb.Append(_collectionKey); // const foreach (KeyValuePair> value in _storages) { sb.Append(Environment.NewLine); // не сохраняем пустые коллекции if (value.Value.Count == 0) { continue; } sb.Append(value.Key); sb.Append(_separatorForKeyValue); sb.Append(value.Value.GetCollectionType); sb.Append(_separatorForKeyValue); sb.Append(value.Value.MaxCount); sb.Append(_separatorForKeyValue); foreach (T? item in value.Value.GetItems()) { string data = item?.GetDataForSave() ?? string.Empty; if (string.IsNullOrEmpty(data)) { continue; } sb.Append(data); sb.Append(_separatorItems); } } using FileStream fs = new(filename, FileMode.Create); byte[] info = new UTF8Encoding(true).GetBytes(sb.ToString()); fs.Write(info, 0, info.Length); return true; } // Создание коллекции по типу private static ICollectionGenObj? CreateCollection(CollectionType collectionType) { return collectionType switch { CollectionType.Array => new ArrayGenObj(), CollectionType.List => new ListGenObj(), _ => null, }; } // Загрузка информации по кораблям в хранилище из файла public bool LoadData(string filename) { if (!File.Exists(filename)) { return false; } string bufferTextFromFile = ""; using (FileStream fs = new(filename, FileMode.Open)) { byte[] b = new byte[fs.Length]; UTF8Encoding temp = new(true); while (fs.Read(b, 0, b.Length) > 0) { bufferTextFromFile += temp.GetString(b); } } string[] strs = bufferTextFromFile.Split( new char[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries); if (strs == null || strs.Length == 0) { return false; } if (!strs[0].Equals(_collectionKey)) { //если нет такой записи, то это не те данные return false; } _storages.Clear(); foreach (string data in strs) { string[] record = data.Split(_separatorForKeyValue, StringSplitOptions.RemoveEmptyEntries); if (record.Length != 4) // > // key | collType | maxcount | all next inf > 4 { continue; } CollectionType collectionType = (CollectionType)Enum.Parse(typeof(CollectionType), record[1]); ICollectionGenObj? collection = StorageCollection.CreateCollection(collectionType); if (collection == null) { return false; } collection.MaxCount = Convert.ToInt32(record[2]); string[] set = record[3].Split(_separatorItems, StringSplitOptions.RemoveEmptyEntries); foreach (string elem in set) { if (elem?.CreateDrawningCar() is T car) { if (!(collection.Insert(car) == -1)) { return false; } } } _storages.Add(record[0], collection); } return true; } }