PIbd22_NikiforovaMV_Contain.../ContainerShip/ShipsGenericStorage.cs
2023-12-29 22:22:08 +04:00

173 lines
6.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<ShipsCollectionInfo, ShipsGenericCollection<DrawningShip, DrawingObjectShip>> _shipStorages;
//Возвращение списка названий наборов
public List<ShipsCollectionInfo> 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<ShipsCollectionInfo, ShipsGenericCollection<DrawningShip, DrawingObjectShip>>();
_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<DrawningShip, DrawingObjectShip>(_pictureWidth, _pictureHeight));
}
// Удаление набора
public void DelSet(string name)
{
ShipsCollectionInfo set = new ShipsCollectionInfo(name, string.Empty);
// проверка, что нет набора с таким именем
if (!_shipStorages.ContainsKey(set))
return;
_shipStorages.Remove(set);
}
// Доступ к набору
public ShipsGenericCollection<DrawningShip, DrawingObjectShip>? 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<DrawningShip, DrawingObjectShip> 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;
}
}
}