diff --git a/ProjectLiner/ProjectLiner/CollectionGenericObjects/CollectionInfo.cs b/ProjectLiner/ProjectLiner/CollectionGenericObjects/CollectionInfo.cs
new file mode 100644
index 0000000..4c792b2
--- /dev/null
+++ b/ProjectLiner/ProjectLiner/CollectionGenericObjects/CollectionInfo.cs
@@ -0,0 +1,74 @@
+using ProjectLiner.CollectionGenericObjects;
+
+namespace ProjectLiner.CollectionGenericObjects;
+
+///
+/// Класс, хранящиий информацию по коллекции
+///
+public class CollectionInfo : IEquatable
+{
+ ///
+ /// Название
+ ///
+ public string Name { get; private set; }
+ ///
+ /// Тип
+ ///
+ public CollectionType CollectionType { get; private set; }
+ ///
+ /// Описание
+ ///
+ public string Description { get; private set; }
+
+ ///
+ /// Разделитель для записи информации по объекту в файл
+ ///
+ private static readonly string _separator = "-";
+
+ ///
+ /// Конструктор
+ ///
+ /// Название
+ /// Тип
+ /// Описание
+ public CollectionInfo(string name, CollectionType collectionType, string description)
+ {
+ Name = name;
+ CollectionType = collectionType;
+ Description = description;
+ }
+
+ ///
+ /// Создание объекта из строки
+ ///
+ /// Строка
+ /// Объект или null
+ public static CollectionInfo? GetCollectionInfo(string data)
+ {
+ string[] strs = data.Split(_separator, StringSplitOptions.RemoveEmptyEntries);
+ if (strs.Length < 1 || strs.Length > 3)
+ {
+ return null;
+ }
+ return new CollectionInfo(strs[0],
+ (CollectionType)Enum.Parse(typeof(CollectionType), strs[1]), strs.Length > 2 ? strs[2] : string.Empty);
+ }
+
+ public override string ToString()
+ {
+ return Name + _separator + CollectionType + _separator + Description;
+ }
+
+ public bool Equals(CollectionInfo? other)
+ {
+ return Name == other?.Name;
+ }
+ public override bool Equals(object? obj)
+ {
+ return Equals(obj as CollectionInfo);
+ }
+ public override int GetHashCode()
+ {
+ return Name.GetHashCode();
+ }
+}
\ No newline at end of file
diff --git a/ProjectLiner/ProjectLiner/CollectionGenericObjects/MassiveGenericObjects.cs b/ProjectLiner/ProjectLiner/CollectionGenericObjects/MassiveGenericObjects.cs
index 809c602..a4a8b16 100644
--- a/ProjectLiner/ProjectLiner/CollectionGenericObjects/MassiveGenericObjects.cs
+++ b/ProjectLiner/ProjectLiner/CollectionGenericObjects/MassiveGenericObjects.cs
@@ -69,7 +69,7 @@ namespace ProjectLiner.CollectionGenericObjects
{
if (comparer.Equals(i, obj))
{
- throw new ObjectAlreadyExistsException(i);
+ throw new ObjectAlreadyExistsException(1);
}
}
}
@@ -94,7 +94,7 @@ namespace ProjectLiner.CollectionGenericObjects
{
if (comparer.Equals(i, obj))
{
- throw new ObjectAlreadyExistsException(i);
+ throw new ObjectAlreadyExistsException(position);
}
}
}
diff --git a/ProjectLiner/ProjectLiner/CollectionGenericObjects/StorageCollection.cs b/ProjectLiner/ProjectLiner/CollectionGenericObjects/StorageCollection.cs
index c434e79..b0eab91 100644
--- a/ProjectLiner/ProjectLiner/CollectionGenericObjects/StorageCollection.cs
+++ b/ProjectLiner/ProjectLiner/CollectionGenericObjects/StorageCollection.cs
@@ -1,226 +1,223 @@
-using System.Data;
-using System.IO;
-using System.Text;
+
+using ProjectLiner.CollectionGenericObjects;
using ProjectLiner.Drawnings;
using ProjectLiner.Exceptions;
-using ProjectLiner.CollectionGenericObjects;
-using ProjectLiner.Exceptions;
+using System.Data;
+using System.Text;
+using System.Xml.Linq;
-namespace ProjectLiner.CollectionGenericObjects
+namespace ProjectLiner.CollectionGenericObjects;
+
+///
+/// Класс-хранилище коллекций
+///
+///
+public class StorageCollection
+ where T : DrawningCommonLiner
{
///
- /// Класс-хранилище коллекций
+ /// Словарь (хранилище) с коллекциями
///
- ///
- public class StorageCollection
- where T : DrawningCommonLiner
+ readonly Dictionary> _storages;
+
+ ///
+ /// Ключевое слово, с которого должен начинаться файл
+ ///
+ private readonly string _collectionKey = "CollectionsStorage";
+
+ ///
+ /// Разделитель для записей коллекции данных в файл
+ ///
+ private readonly string _separatorItems = ";";
+
+ ///
+ /// Разделитель для записи ключа и значения элемента словаря
+ ///
+ private readonly string _separatorForKeyValue = "|";
+
+ ///
+ /// Возвращение списка названий коллекций
+ ///
+ public List Keys => _storages.Keys.ToList();
+
+ ///
+ /// Конструктор
+ ///
+ public StorageCollection()
{
- ///
- /// Словарь (хранилище) с коллекциями
- ///
- readonly Dictionary> _storages;
-
- ///
- /// Возвращение списка названий коллекций
- ///
- public List Keys => _storages.Keys.ToList();
-
- ///
- /// Ключевое слово, с которого должен начинаться файл
- ///
- private readonly string _collectionKey = "CollectionsStorage";
-
- ///
- /// Разделитель для записи ключа и значения элемента словаря
- ///
- private readonly string _separatorForKeyValue = "|";
-
- ///
- /// Разделитель для записей коллекции данных в файл
- ///
- private readonly string _separatorItems = ";";
-
- ///
- /// Конструктор
- ///
- public StorageCollection()
+ _storages = new Dictionary>();
+ }
+ ///
+ /// Добавление коллекции в хранилище
+ ///
+ /// Название коллекции
+ /// тип коллекции
+ public void AddCollection(string name, CollectionType collectionType)
+ {
+ CollectionInfo collectionInfo = new(name, collectionType, string.Empty);
+ if (name == null || _storages.ContainsKey(collectionInfo))
+ return;
+ switch (collectionType)
{
- _storages = new Dictionary>();
- }
-
- ///
- /// Добавление коллекции в хранилище
- ///
- /// Название коллекции
- /// тип коллекции
- public void AddCollection(string name, CollectionType collectionType)
- {
- if (name == null || _storages.ContainsKey(name))
+ case CollectionType.None:
return;
-
- switch (collectionType)
- {
- case CollectionType.None:
- return;
- case CollectionType.Massive:
- _storages[name] = new MassiveGenericObjects();
- return;
- case CollectionType.List:
- _storages[name] = new ListGenericObjects();
- return;
- }
- }
-
- ///
- /// Удаление коллекции
- ///
- /// Название коллекции
- public void DelCollection(string name)
- {
- if (_storages.ContainsKey(name))
- _storages.Remove(name);
- }
-
- ///
- /// Доступ к коллекции
- ///
- /// Название коллекции
- ///
- public ICollectionGenericObjects? this[string name]
- {
- get
- {
- if (name == null || !_storages.ContainsKey(name))
- return null;
-
- return _storages[name];
- }
- }
-
- ///
- /// Сохранение информации по самолетам в хранилище в файл
- ///
- /// Путь и имя файла
- /// true - сохранение прошло успешно, false - ошибка при сохранении данных
- public void SaveData(string filename)
- {
- if (_storages.Count == 0)
- throw new NullReferenceException("В хранилище отсутствуют коллекции для сохранения");
-
- if (File.Exists(filename))
- File.Delete(filename);
-
-
- using (StreamWriter sw = new(filename))
- {
- sw.Write(_collectionKey);
- foreach (KeyValuePair> value in _storages)
- {
- sw.Write(Environment.NewLine);
- if (value.Value.Count == 0)
- {
- continue;
- }
-
- sw.Write(value.Key);
- sw.Write(_separatorForKeyValue);
- sw.Write(value.Value.GetCollectionType);
- sw.Write(_separatorForKeyValue);
- sw.Write(value.Value.MaxCount);
- sw.Write(_separatorForKeyValue);
-
- foreach (T? item in value.Value.GetItems())
- {
- string data = item?.GetDataForSave() ?? string.Empty;
- if (string.IsNullOrEmpty(data))
- {
- continue;
- }
-
- sw.Write(data);
- sw.Write(_separatorItems);
- }
- }
- }
- }
-
- ///
- /// Загрузка информации по самолетам в хранилище из файла
- ///
- /// Путь и имя файла
- /// true - загрузка прошла успешно, false - ошибка при загрузке данных
- public void LoadData(string filename)
- {
- if (!File.Exists(filename))
- {
- throw new FileNotFoundException("Файл не существует");
- }
-
- using (StreamReader sr = new(filename))
- {
- string str = sr.ReadLine();
- if (str == null || str.Length == 0)
- {
- throw new FileFormatException("В файле нет данных");
- }
-
- if (!str.Equals(_collectionKey))
- {
- throw new FileFormatException("В файле неверные данные");
- }
- _storages.Clear();
-
- while (!sr.EndOfStream)
- {
- string[] record = sr.ReadLine().Split(_separatorForKeyValue, StringSplitOptions.RemoveEmptyEntries);
- if (record.Length != 4)
- {
- continue;
- }
-
- CollectionType collectionType = (CollectionType)Enum.Parse(typeof(CollectionType), record[1]);
- ICollectionGenericObjects? collection = StorageCollection.CreateCollection(collectionType);
- if (collection == null)
- {
- throw new InvalidOperationException("Не удалось создать коллекцию");
- }
-
- collection.MaxCount = Convert.ToInt32(record[2]);
-
- string[] set = record[3].Split(_separatorItems, StringSplitOptions.RemoveEmptyEntries);
- foreach (string elem in set)
- {
- if (elem?.CreateDrawningCommonLiner() is T airplane)
- {
- try
- {
- if (collection.Insert(airplane) == -1)
- throw new InvalidOperationException("Объект не удалось добавить в коллекцию: " + record[3]);
- }
- catch (CollectionOverflowException ex)
- {
- throw new OverflowException("Коллекция переполнена", ex);
- }
- }
- }
- _storages.Add(record[0], collection);
- }
- }
- }
-
- ///
- /// Создание коллекции по типу
- ///
- ///
- ///
- private static ICollectionGenericObjects? CreateCollection(CollectionType collectionType)
- {
- return collectionType switch
- {
- CollectionType.Massive => new MassiveGenericObjects(),
- CollectionType.List => new ListGenericObjects(),
- _ => null,
- };
+ case CollectionType.Massive:
+ _storages[collectionInfo] = new MassiveGenericObjects();
+ return;
+ case CollectionType.List:
+ _storages[collectionInfo] = new ListGenericObjects();
+ return;
+ default: break;
}
}
-}
+
+ ///
+ /// Удаление коллекции
+ ///
+ /// Название коллекции
+ public void DelCollection(string name)
+ {
+ CollectionInfo collectionInfo = new(name, CollectionType.None, string.Empty);
+ if (_storages.ContainsKey(collectionInfo))
+ _storages.Remove(collectionInfo);
+ }
+
+ ///
+ /// Доступ к коллекции
+ ///
+ /// Название коллекции
+ ///
+ public ICollectionGenericObjects? this[string name]
+ {
+ get
+ {
+ CollectionInfo collectionInfo = new(name, CollectionType.None, string.Empty);
+ if (_storages.ContainsKey(collectionInfo))
+ return _storages[collectionInfo];
+ return null;
+ }
+ }
+
+ ///
+ /// Сохранение информации по автомобилям в хранилище в файл
+ ///
+ ///
+ ///
+ public void SaveData(string filename)
+ {
+ if (_storages.Count == 0)
+ {
+ throw new InvalidDataException("В хранилище отсутствуют коллекции для сохранения");
+
+ }
+ if (File.Exists(filename))
+ {
+ File.Delete(filename);
+ }
+ using (StreamWriter writer = new(filename))
+ {
+ writer.Write(_collectionKey);
+ foreach (KeyValuePair> value in _storages)
+ {
+ writer.Write(Environment.NewLine);
+ // не сохраняем пустые коллекции
+ if (value.Value.Count == 0)
+ {
+ continue;
+ }
+ writer.Write(value.Key);
+ writer.Write(_separatorForKeyValue);
+ writer.Write(value.Value.MaxCount);
+ writer.Write(_separatorForKeyValue);
+
+ foreach (T? item in value.Value.GetItems())
+ {
+ string data = item?.GetDataForSave() ?? string.Empty;
+ if (string.IsNullOrEmpty(data))
+ {
+ continue;
+ }
+ writer.Write(data);
+ writer.Write(_separatorItems);
+ }
+ }
+ }
+ }
+
+ ///
+ /// Загрузка информации по автомобилям в хранилище из файла
+ ///
+ /// >Путь и имя файла
+ /// true - загрузка прошла успешно, false - ошибка при загрузке данных
+ public void LoadData(string filename)
+ {
+ if (!File.Exists(filename))
+ {
+ throw new FileNotFoundException($"{filename} не существует");
+ }
+ using (StreamReader reader = new(filename))
+ {
+ string line = reader.ReadLine();
+ if (line == null || line.Length == 0)
+ {
+ throw new FileFormatException("Файл не подходит");
+ }
+ if (!line.Equals(_collectionKey))
+ {
+
+ throw new IOException("В файле неверные данные");
+ }
+ _storages.Clear();
+ while ((line = reader.ReadLine()) != null)
+ {
+ string[] record = line.Split(_separatorForKeyValue, StringSplitOptions.RemoveEmptyEntries);
+ if (record.Length != 3)
+ {
+ continue;
+ }
+ CollectionInfo? collectionInfo = CollectionInfo.GetCollectionInfo(record[0]) ?? throw new Exception("Не удалось определить информацию коллекции" + record[0]);
+
+ ICollectionGenericObjects? collection = StorageCollection.CreateCollection(collectionInfo.CollectionType);
+ if (collection == null)
+ {
+ throw new InvalidOperationException("Не удалось создать коллекцию");
+ }
+ collection.MaxCount = Convert.ToInt32(record[1]);
+ string[] set = record[2].Split(_separatorItems, StringSplitOptions.RemoveEmptyEntries);
+ foreach (string elem in set)
+ {
+ if (elem?.CreateDrawningCommonLiner() is T truck)
+ {
+ try
+ {
+ if (collection.Insert(truck) == -1)
+ {
+ throw new ConstraintException("Объект не удалось добавить в коллекцию: " + record[3]);
+ }
+ }
+ catch (CollectionOverflowException ex)
+ {
+ throw new DataException("Коллекция переполнена", ex);
+ }
+ }
+ }
+ _storages.Add(collectionInfo, collection);
+ }
+ }
+ }
+
+ ///
+ /// Создание коллекции по типу
+ ///
+ ///
+ ///
+ private static ICollectionGenericObjects? CreateCollection(CollectionType collectionType)
+ {
+ return collectionType switch
+ {
+ CollectionType.Massive => new MassiveGenericObjects(),
+ CollectionType.List => new ListGenericObjects(),
+ _ => null,
+ };
+ }
+}
\ No newline at end of file
diff --git a/ProjectLiner/ProjectLiner/FormLinerCollection.cs b/ProjectLiner/ProjectLiner/FormLinerCollection.cs
index ed4a241..5d88ee7 100644
--- a/ProjectLiner/ProjectLiner/FormLinerCollection.cs
+++ b/ProjectLiner/ProjectLiner/FormLinerCollection.cs
@@ -86,6 +86,11 @@ namespace ProjectLiner
MessageBox.Show(ex.Message);
_logger.LogError("Ошибка: {Message}", ex.Message);
}
+ catch (ObjectAlreadyExistsException ex)
+ {
+ MessageBox.Show("Такой объект есть в коллекции");
+ _logger.LogWarning($"Добавление существующего объекта: {ex.Message}");
+ }
}
///
@@ -240,7 +245,7 @@ namespace ProjectLiner
listBoxCollection.Items.Clear();
for (int i = 0; i < _storageCollection.Keys?.Count; ++i)
{
- string? colName = _storageCollection.Keys?[i];
+ string? colName = _storageCollection.Keys?[i].Name;
if (!string.IsNullOrEmpty(colName))
listBoxCollection.Items.Add(colName);
}