diff --git a/ProjectBomber/ProjectBomber/CollectionGenericObject/AbstractCompany.cs b/ProjectBomber/ProjectBomber/CollectionGenericObject/AbstractCompany.cs index 26831f1..a99a91e 100644 --- a/ProjectBomber/ProjectBomber/CollectionGenericObject/AbstractCompany.cs +++ b/ProjectBomber/ProjectBomber/CollectionGenericObject/AbstractCompany.cs @@ -22,19 +22,22 @@ public abstract class AbstractCompany /// Ширина окна /// protected readonly int _pictureWidth; + /// /// Высота окна /// protected readonly int _pictureHeight; + /// /// Коллекция автомобилей /// protected ICollectionGenericObject? _collection = null; + /// /// Вычисление максимального количества элементов, который можно разместить в окне /// - - private int GetMaxCount => (_pictureWidth * _pictureHeight / (_placeSizeWidth * _placeSizeHeight)); + private int GetMaxCount => (_pictureWidth * _pictureHeight / (_placeSizeWidth * _placeSizeHeight)) - 1; + /// /// Конструктор /// @@ -48,16 +51,18 @@ public abstract class AbstractCompany _collection = collection; _collection.MaxCount = GetMaxCount; } + /// /// Перегрузка оператора сложения для класса /// /// Компания - /// Добавляемый объект + /// Добавляемый объект /// - public static int? operator +(AbstractCompany company, DrawningPlane plane) + public static int operator +(AbstractCompany company, DrawningPlane plane) { - return company._collection?.Insert(plane); + return company._collection.Insert(plane, new DrawningPlaneEqutables()); } + /// /// Перегрузка оператора удаления для класса /// @@ -68,7 +73,8 @@ public abstract class AbstractCompany { return company._collection?.Remove(position); } - /// + + /// /// Получение случайного объекта из коллекции /// /// @@ -77,6 +83,7 @@ public abstract class AbstractCompany Random rnd = new(); return _collection?.Get(rnd.Next(GetMaxCount)); } + /// /// Вывод всей коллекции /// @@ -86,21 +93,34 @@ public abstract class AbstractCompany Bitmap bitmap = new(_pictureWidth, _pictureHeight); Graphics graphics = Graphics.FromImage(bitmap); DrawBackgound(graphics); + SetObjectsPosition(); for (int i = 0; i < (_collection?.Count ?? 0); ++i) { - DrawningPlane? obj = _collection?.Get(i); - obj?.DrawPlane(graphics); + try + { + DrawningPlane? obj = _collection?.Get(i); + obj?.DrawPlane(graphics); + } + catch (Exception) { } } return bitmap; } + /// /// Вывод заднего фона /// /// protected abstract void DrawBackgound(Graphics g); + /// /// Расстановка объектов /// protected abstract void SetObjectsPosition(); + + /// + /// Сортировка + /// + /// Сравнитель объектов + public void Sort(IComparer comparer) => _collection?.CollectionSort(comparer); } \ No newline at end of file diff --git a/ProjectBomber/ProjectBomber/CollectionGenericObject/CollectionInfo.cs b/ProjectBomber/ProjectBomber/CollectionGenericObject/CollectionInfo.cs new file mode 100644 index 0000000..ad3c1c8 --- /dev/null +++ b/ProjectBomber/ProjectBomber/CollectionGenericObject/CollectionInfo.cs @@ -0,0 +1,78 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Xml.Linq; + +namespace ProjectAirBomber.CollectionGenericObject; + +/// +/// Класс, хранящиий информацию по коллекции +/// +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/ProjectBomber/ProjectBomber/CollectionGenericObject/ICollectionGenericObject.cs b/ProjectBomber/ProjectBomber/CollectionGenericObject/ICollectionGenericObject.cs index 7313cfd..e72a769 100644 --- a/ProjectBomber/ProjectBomber/CollectionGenericObject/ICollectionGenericObject.cs +++ b/ProjectBomber/ProjectBomber/CollectionGenericObject/ICollectionGenericObject.cs @@ -1,4 +1,5 @@ -using System; +using ProjectAirBomber.Drawnings; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -24,7 +25,7 @@ where T : class /// /// Добавляемый объект /// true - вставка прошла удачно, false - вставка не удалась - int Insert(T obj); + int Insert(T obj, IEqualityComparer? comparer = null); /// /// Добавление объекта в коллекцию на конкретную позицию @@ -32,30 +33,35 @@ where T : class /// Добавляемый объект /// Позиция /// true - вставка прошла удачно, false - вставка не удалась - int Insert(T obj, int position); + int Insert(T obj, int position, IEqualityComparer? comparer = null); /// /// Удаление объекта из коллекции с конкретной позиции /// /// Позиция /// true - удаление прошло удачно, false - удаление не удалось - T Remove(int position); + T? Remove(int position); /// /// Получение объекта по позиции /// /// Позиция /// Объект - T? Get(int position); - + T Get(int position); /// - /// Получение типа коллекции - /// - CollectionType GetCollectionType { get; } - - /// - /// Получение объектов коллекции по одному + /// получение типа коллекции /// - /// Поэлементый вывод элементов коллекции + CollectionType GetCollectionType { get; } + /// + /// получение объектов коллекции по одному + /// + /// IEnumerable GetItems(); + /// + /// Сортировка коллекции + /// + /// Сравнитель объектов + void CollectionSort(IComparer comparer); + + } \ No newline at end of file diff --git a/ProjectBomber/ProjectBomber/CollectionGenericObject/ListGenericObjects.cs b/ProjectBomber/ProjectBomber/CollectionGenericObject/ListGenericObjects.cs index f6ba753..e71fcab 100644 --- a/ProjectBomber/ProjectBomber/CollectionGenericObject/ListGenericObjects.cs +++ b/ProjectBomber/ProjectBomber/CollectionGenericObject/ListGenericObjects.cs @@ -1,31 +1,36 @@ using ProjectAirBomber.CollectionGenericObject; +using ProjectAirBomber.Drawnings; using ProjectAirBomber.Exceptions; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; + namespace ProjectAirBomber.CollectionGenericObject; public class ListGenericObjects : ICollectionGenericObject where T : class { - /// /// Список объектов, которые храним /// private readonly List _collection; - /// /// Максимально допустимое число объектов в списке /// private int _maxCount; - public int Count => _collection.Count; - - public int MaxCount { set { if (value > 0) { _maxCount = value; } } get { return Count; } } - + public int MaxCount + { + get + { + return Count; + } + set + { + if (value > 0) + { + _maxCount = value; + } + } + } public CollectionType GetCollectionType => CollectionType.List; @@ -36,49 +41,56 @@ public class ListGenericObjects : ICollectionGenericObject { _collection = new(); } - - public T? Get(int position) + public T Get(int position) { - // TODO проверка позиции if (position >= Count || position < 0) throw new PositionOutOfCollectionException(position); return _collection[position]; } - - public int Insert(T obj) + public int Insert(T obj, IEqualityComparer? compaper = null) { - // TODO проверка, что не превышено максимальное количество элементов - // TODO вставка в конец набора - if (Count == _maxCount) throw new CollectionOverflowException(Count); + if (compaper != null) + { + if (_collection.Contains(obj, compaper)) + { + throw new ObjectIsEqualException(); + } + } + if (Count == _maxCount) throw new CollectionOverflowException(); _collection.Add(obj); return Count; } - - public int Insert(T obj, int position) + public int Insert(T obj, int position, IEqualityComparer? compaper = null) { - // TODO проверка, что не превышено максимальное количество элементов - // TODO проверка позиции - // TODO вставка по позиции + if (compaper != null) + { + if (_collection.Contains(obj, compaper)) + { + throw new ObjectIsEqualException(); + } + } if (Count == _maxCount) throw new CollectionOverflowException(Count); if (position >= Count || position < 0) throw new PositionOutOfCollectionException(position); _collection.Insert(position, obj); return position; } - - public T Remove(int position) + public T? Remove(int position) { - // TODO проверка позиции - // TODO удаление объекта из списка if (position >= Count || position < 0) throw new PositionOutOfCollectionException(position); - T obj = _collection[position]; + T temp = _collection[position]; _collection.RemoveAt(position); - return obj; + return temp; } public IEnumerable GetItems() { - for (int i = 0; i < Count; ++i) + for (int i = 0; i < Count; i++) { yield return _collection[i]; } } -} + + public void CollectionSort(IComparer comparer) + { + _collection.Sort(comparer); + } +} \ No newline at end of file diff --git a/ProjectBomber/ProjectBomber/CollectionGenericObject/MassiveGenericObject.cs b/ProjectBomber/ProjectBomber/CollectionGenericObject/MassiveGenericObject.cs index 4427190..0102a5f 100644 --- a/ProjectBomber/ProjectBomber/CollectionGenericObject/MassiveGenericObject.cs +++ b/ProjectBomber/ProjectBomber/CollectionGenericObject/MassiveGenericObject.cs @@ -1,4 +1,5 @@ -using ProjectAirBomber.Exceptions; +using ProjectAirBomber.Drawnings; +using ProjectAirBomber.Exceptions; namespace ProjectAirBomber.CollectionGenericObject; @@ -17,6 +18,7 @@ where T : class { return _collection.Length; } + set { if (value > 0) @@ -34,6 +36,7 @@ where T : class } public CollectionType GetCollectionType => CollectionType.Massive; + /// /// Конструктор /// @@ -42,17 +45,24 @@ where T : class _collection = Array.Empty(); } - public T? Get(int position) + public T Get(int position) { - // TODO проверка позиции if (position >= _collection.Length || position < 0) - { return null; } + { throw new PositionOutOfCollectionException(position); } + if (_collection[position] == null) throw new ObjectNotFoundException(position); return _collection[position]; } - public int Insert(T obj) + public int Insert(T obj, IEqualityComparer? comparer = null) { - // TODO вставка в свободное место набора + if (comparer != null) + { + foreach (T? item in _collection) + { + if ((comparer as IEqualityComparer).Equals(obj as DrawningPlane, item as DrawningPlane)) + throw new ObjectIsEqualException(); + } + } int index = 0; while (index < _collection.Length) { @@ -65,17 +75,23 @@ where T : class index++; } throw new CollectionOverflowException(Count); + } - public int Insert(T obj, int position) + public int Insert(T obj, int position, IEqualityComparer? comparer = null) { - // TODO проверка позиции - // TODO проверка, что элемент массива по этой позиции пустой, если нет, то - // ищется свободное место после этой позиции и идет вставка туда - // если нет после, ищем до - // TODO вставка + if (comparer != null) + { + foreach (T? item in _collection) + { + if ((comparer as IEqualityComparer).Equals(obj as DrawningPlane, item as DrawningPlane)) + throw new ObjectIsEqualException(); + } + } if (position >= _collection.Length || position < 0) - { throw new PositionOutOfCollectionException(position); } + { + throw new PositionOutOfCollectionException(position); + } if (_collection[position] == null) { @@ -106,12 +122,12 @@ where T : class public T Remove(int position) { - // TODO проверка позиции - // TODO удаление объекта из массива, присвоив элементу массива значение null + if (position >= _collection.Length || position < 0) - { throw new PositionOutOfCollectionException(position); } - if (_collection[position] == null) - { throw new ObjectNotFoundException(position); } + { + throw new PositionOutOfCollectionException(position); + } + if (_collection[position] == null) throw new ObjectNotFoundException(position); T obj = _collection[position]; _collection[position] = null; return obj; @@ -119,9 +135,14 @@ where T : class public IEnumerable GetItems() { - for (int i = 0; i < _collection.Length; ++i) + for (int i = 0; i < _collection.Length; i++) { yield return _collection[i]; } } + + public void CollectionSort(IComparer comparer) + { + Array.Sort(_collection, comparer); + } } \ No newline at end of file diff --git a/ProjectBomber/ProjectBomber/CollectionGenericObject/StorageCollection.cs b/ProjectBomber/ProjectBomber/CollectionGenericObject/StorageCollection.cs index e7a16ce..dfde95e 100644 --- a/ProjectBomber/ProjectBomber/CollectionGenericObject/StorageCollection.cs +++ b/ProjectBomber/ProjectBomber/CollectionGenericObject/StorageCollection.cs @@ -15,34 +15,18 @@ public class StorageCollection /// /// Словарь (хранилище) с коллекциями /// - readonly Dictionary> _storages; - + readonly Dictionary> _storages; /// /// Возвращение списка названий коллекций /// - public List Keys => _storages.Keys.ToList(); - /// - /// Ключевое слово, с которого должен начинаться файл - /// - private readonly string _collectionKey = "CollectionsStorage"; - - /// - /// Разделитель для записи ключа и значения элемента словаря - /// - private readonly string _separatorForKeyValue = "|"; - - /// - /// Разделитель для записей коллекции данных в файл - /// - private readonly string _separatorItems = ";"; + public List Keys => _storages.Keys.ToList(); /// /// Конструктор /// public StorageCollection() { - _storages = new Dictionary>(); + _storages = new Dictionary>(); } - /// /// Добавление коллекции в хранилище /// @@ -52,25 +36,23 @@ public class StorageCollection { // TODO проверка, что name не пустой и нет в словаре записи с таким ключом // TODO Прописать логику для добавления - - if (_storages.ContainsKey(name)) return; - + CollectionInfo collectionInfo = new CollectionInfo(name, collectionType, string.Empty); + if (_storages.ContainsKey(collectionInfo)) return; if (collectionType == CollectionType.None) return; else if (collectionType == CollectionType.Massive) - _storages[name] = new MassiveGenericObject(); + _storages[collectionInfo] = new MassiveGenericObject(); else if (collectionType == CollectionType.List) - _storages[name] = new ListGenericObjects(); + _storages[collectionInfo] = new ListGenericObjects(); } - /// /// Удаление коллекции /// /// Название коллекции public void DelCollection(string name) { - // TODO Прописать логику для удаления коллекции - if (_storages.ContainsKey(name)) - _storages.Remove(name); + CollectionInfo collectionInfo = new CollectionInfo(name, CollectionType.None, string.Empty); + if (_storages.ContainsKey(collectionInfo)) + _storages.Remove(collectionInfo); } /// @@ -78,28 +60,38 @@ public class StorageCollection /// /// Название коллекции /// - public ICollectionGenericObject? this[string name] + public ICollectionGenericObject this[string name] { get { - // TODO Продумать логику получения объекта - if (_storages.ContainsKey(name)) - return _storages[name]; + CollectionInfo collectionInfo = new CollectionInfo(name, CollectionType.None, string.Empty); + + if (_storages.ContainsKey(collectionInfo)) + return _storages[collectionInfo]; + return null; + } } - + /// + /// Ключевое слово, с которого должен начинаться файл + /// + private readonly string _collectionKey = "CollectionsStorage"; + /// + /// Разделитель для записи ключа и значения элемента словаря + /// + private readonly string _separatorForKeyValue = "|"; + /// + /// Разделитель для записей коллекции данных в файл + /// + private readonly string _separatorItems = ";"; /// /// Сохранение информации по автомобилям в хранилище в файл /// /// Путь и имя файла - /// true - сохранение прошло успешно, false - ошибка при сохранении данных - /// - /// Сохранение информации по автомобилям в хранилище в файл - /// - /// Путь и имя файла - /// true - сохранение прошло успешно, false - ошибка при сохранении данных + /// true - сохранение прошло успешно, false - ошибка при + ///сохранении данных public void SaveData(string filename) { if (_storages.Count == 0) @@ -113,19 +105,16 @@ public class StorageCollection using (StreamWriter writer = new StreamWriter(filename)) { writer.Write(_collectionKey); - foreach (KeyValuePair> value in _storages) + foreach (KeyValuePair> value in _storages) { StringBuilder sb = new(); 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()) @@ -143,17 +132,11 @@ public class StorageCollection } } - /// /// Загрузка информации по автомобилям в хранилище из файла /// - /// Путь и имя файла - /// true - загрузка прошла успешно, false - ошибка при загрузке данных - /// - /// Загрузка информации по автомобилям в хранилище из файла - /// - /// Путь и имя файла - /// true - загрузка прошла успешно, false - ошибка при загрузке данных + /// Путь и имя файла/// true - загрузка прошла успешно, false - ошибка при загрузке + ///данных public void LoadData(string filename) { if (!File.Exists(filename)) @@ -176,25 +159,26 @@ public class StorageCollection while ((strs = fs.ReadLine()) != null) { string[] record = strs.Split(_separatorForKeyValue, StringSplitOptions.RemoveEmptyEntries); - if (record.Length != 4) + if (record.Length != 3) { continue; } - CollectionType collectionType = (CollectionType)Enum.Parse(typeof(CollectionType), record[1]); - ICollectionGenericObject? collection = StorageCollection.CreateCollection(collectionType); + CollectionInfo? collectionInfo = CollectionInfo.GetCollectionInfo(record[0]) ?? throw new Exception("Не удалось определить информацию коллекции: " + record[0]); + + ICollectionGenericObject? collection = StorageCollection.CreateCollection(collectionInfo.CollectionType); if (collection == null) { throw new Exception("Не удалось создать коллекцию"); } - collection.MaxCount = Convert.ToInt32(record[2]); - string[] set = record[3].Split(_separatorItems, StringSplitOptions.RemoveEmptyEntries); + collection.MaxCount = Convert.ToInt32(record[1]); + string[] set = record[2].Split(_separatorItems, StringSplitOptions.RemoveEmptyEntries); foreach (string elem in set) { - if (elem?.CreateDrawningPlane() is T ship) + if (elem?.CreateDrawningPlane() is T plane) { try { - if (collection.Insert(ship) == -1) + if (collection.Insert(plane) == -1) { throw new Exception("Объект не удалось добавить в коллекцию: " + record[3]); } @@ -205,7 +189,7 @@ public class StorageCollection } } } - _storages.Add(record[0], collection); + _storages.Add(collectionInfo, collection); } } } diff --git a/ProjectBomber/ProjectBomber/Drawnings/DrawningPlaneEqutables.cs b/ProjectBomber/ProjectBomber/Drawnings/DrawningPlaneEqutables.cs new file mode 100644 index 0000000..fd6c096 --- /dev/null +++ b/ProjectBomber/ProjectBomber/Drawnings/DrawningPlaneEqutables.cs @@ -0,0 +1,62 @@ +using System.Diagnostics.CodeAnalysis; +using ProjectAirBomber.Entities; + +namespace ProjectAirBomber.Drawnings; +/// +/// Реализация сравнения двух объектов класса-прорисовки +/// +public class DrawningPlaneEqutables : IEqualityComparer +{ + public bool Equals(DrawningPlane? x, DrawningPlane? y) + { + if (x == null || x.EntityPlane == null) + { + return false; + } + if (y == null || y.EntityPlane == null) + { + return false; + } + if (x.GetType().Name != y.GetType().Name) + { + return false; + } + if (x.EntityPlane.Speed != y.EntityPlane.Speed) + { + return false; + } + if (x.EntityPlane.Weight != y.EntityPlane.Weight) + { + return false; + } + if (x.EntityPlane.BodyColor != y.EntityPlane.BodyColor) + { + return false; + } + if (x is EntityAirBomber && y is EntityAirBomber) + { + // TODO доделать логику сравнения дополнительных параметров + EntityAirBomber _x = (EntityAirBomber)x.EntityPlane; + EntityAirBomber _y = (EntityAirBomber)x.EntityPlane; + if (_x.AdditionalColor != _y.AdditionalColor) + { + return false; + } + if (_x.Bomb != _y.Bomb) + { + return false; + } + if (_x.Engine != _y.Engine) + { + return false; + } + } + return true; + } + + + public int GetHashCode([DisallowNull] DrawningPlane? obj) + { + return obj.GetHashCode(); + } +} diff --git a/ProjectBomber/ProjectBomber/Drawnings/PlaneCompareByColor.cs b/ProjectBomber/ProjectBomber/Drawnings/PlaneCompareByColor.cs new file mode 100644 index 0000000..25ea421 --- /dev/null +++ b/ProjectBomber/ProjectBomber/Drawnings/PlaneCompareByColor.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectAirBomber.Drawnings; + +/// +/// сравнение по цвету, скорости и весу +/// +public class PlaneCompareByColor : IComparer +{ + public int Compare(DrawningPlane? x, DrawningPlane? y) + { + if (x == null || x.EntityPlane == null) + { + return 1; + } + + if (y == null || y.EntityPlane == null) + { + return -1; + } + var bodycolorCompare = x.EntityPlane.BodyColor.Name.CompareTo(y.EntityPlane.BodyColor.Name); + if (bodycolorCompare != 0) + { + return bodycolorCompare; + } + var speedCompare = x.EntityPlane.Speed.CompareTo(y.EntityPlane.Speed); + if (speedCompare != 0) + { + return speedCompare; + } + return x.EntityPlane.Weight.CompareTo(y.EntityPlane.Weight); + } +} \ No newline at end of file diff --git a/ProjectBomber/ProjectBomber/Drawnings/PlaneCompareByType.cs b/ProjectBomber/ProjectBomber/Drawnings/PlaneCompareByType.cs new file mode 100644 index 0000000..b2004fd --- /dev/null +++ b/ProjectBomber/ProjectBomber/Drawnings/PlaneCompareByType.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectAirBomber.Drawnings; +/// +/// Сравнение по типу, скорости, весу +/// +public class PlaneCompareByType : IComparer +{ + public int Compare(DrawningPlane? x, DrawningPlane? y) + { + if (x == null || x.EntityPlane == null) + { + return 1; + } + if (y == null || y.EntityPlane == null) + { + return -1; + } + if (x.GetType().Name != y.GetType().Name) + { + return x.GetType().Name.CompareTo(y.GetType().Name); + } + var speedCompare = x.EntityPlane.Speed.CompareTo(y.EntityPlane.Speed); + if (speedCompare != 0) + { + return speedCompare; + } + return x.EntityPlane.Weight.CompareTo(y.EntityPlane.Weight); + } +} \ No newline at end of file diff --git a/ProjectBomber/ProjectBomber/Exceptions/ObjectIsEqualException.cs b/ProjectBomber/ProjectBomber/Exceptions/ObjectIsEqualException.cs new file mode 100644 index 0000000..d31596a --- /dev/null +++ b/ProjectBomber/ProjectBomber/Exceptions/ObjectIsEqualException.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.Serialization; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectAirBomber.Exceptions; +/// +/// Класс, описывающий ошибку переполнения коллекции +/// +[Serializable] +public class ObjectIsEqualException : ApplicationException +{ + public ObjectIsEqualException(int count) : base("В коллекции содержится равный элемент: " + count) { } + public ObjectIsEqualException() : base() { } + public ObjectIsEqualException(string message) : base(message) { } + public ObjectIsEqualException(string message, Exception exception) : base(message, exception) { } + protected ObjectIsEqualException(SerializationInfo info, StreamingContext contex) : base(info, contex) { } +} diff --git a/ProjectBomber/ProjectBomber/FormPlaneCollection.Designer.cs b/ProjectBomber/ProjectBomber/FormPlaneCollection.Designer.cs index f3ab646..f6dce76 100644 --- a/ProjectBomber/ProjectBomber/FormPlaneCollection.Designer.cs +++ b/ProjectBomber/ProjectBomber/FormPlaneCollection.Designer.cs @@ -30,6 +30,8 @@ { groupBoxTools = new GroupBox(); panelCompanyTools = new Panel(); + buttonSortByColor = new Button(); + buttonSortByType = new Button(); maskedTextBox = new MaskedTextBox(); buttonAddPlane = new Button(); buttonRefresh = new Button(); @@ -75,6 +77,8 @@ // // panelCompanyTools // + panelCompanyTools.Controls.Add(buttonSortByColor); + panelCompanyTools.Controls.Add(buttonSortByType); panelCompanyTools.Controls.Add(maskedTextBox); panelCompanyTools.Controls.Add(buttonAddPlane); panelCompanyTools.Controls.Add(buttonRefresh); @@ -82,11 +86,31 @@ panelCompanyTools.Controls.Add(buttonDelPlane); panelCompanyTools.Dock = DockStyle.Bottom; panelCompanyTools.Enabled = false; - panelCompanyTools.Location = new Point(3, 409); + panelCompanyTools.Location = new Point(3, 391); panelCompanyTools.Name = "panelCompanyTools"; - panelCompanyTools.Size = new Size(244, 273); + panelCompanyTools.Size = new Size(244, 291); panelCompanyTools.TabIndex = 9; // + // buttonSortByColor + // + buttonSortByColor.Location = new Point(6, 245); + buttonSortByColor.Name = "buttonSortByColor"; + buttonSortByColor.Size = new Size(229, 32); + buttonSortByColor.TabIndex = 9; + buttonSortByColor.Text = "Сортировка по цвету"; + buttonSortByColor.UseVisualStyleBackColor = true; + buttonSortByColor.Click += buttonSortByColor_Click; + // + // buttonSortByType + // + buttonSortByType.Location = new Point(9, 207); + buttonSortByType.Name = "buttonSortByType"; + buttonSortByType.Size = new Size(229, 32); + buttonSortByType.TabIndex = 8; + buttonSortByType.Text = "Сортировка по типу"; + buttonSortByType.UseVisualStyleBackColor = true; + buttonSortByType.Click += buttonSortByType_Click; + // // maskedTextBox // maskedTextBox.Location = new Point(9, 56); @@ -142,14 +166,14 @@ comboBoxSelectionCompany.DropDownStyle = ComboBoxStyle.DropDownList; comboBoxSelectionCompany.FormattingEnabled = true; comboBoxSelectionCompany.Items.AddRange(new object[] { "Ангар" }); - comboBoxSelectionCompany.Location = new Point(6, 375); + comboBoxSelectionCompany.Location = new Point(6, 357); comboBoxSelectionCompany.Name = "comboBoxSelectionCompany"; comboBoxSelectionCompany.Size = new Size(232, 28); comboBoxSelectionCompany.TabIndex = 0; // // buttonCreateCompany // - buttonCreateCompany.Location = new Point(6, 340); + buttonCreateCompany.Location = new Point(6, 322); buttonCreateCompany.Name = "buttonCreateCompany"; buttonCreateCompany.Size = new Size(232, 29); buttonCreateCompany.TabIndex = 6; @@ -338,5 +362,7 @@ private ToolStripMenuItem loadToolStripMenuItem; private SaveFileDialog saveFileDialog; private OpenFileDialog openFileDialog; + private Button buttonSortByColor; + private Button buttonSortByType; } } \ No newline at end of file diff --git a/ProjectBomber/ProjectBomber/FormPlaneCollection.cs b/ProjectBomber/ProjectBomber/FormPlaneCollection.cs index ca10ea5..8565771 100644 --- a/ProjectBomber/ProjectBomber/FormPlaneCollection.cs +++ b/ProjectBomber/ProjectBomber/FormPlaneCollection.cs @@ -78,6 +78,12 @@ public partial class FormPlaneCollection : Form MessageBox.Show("Не удалось добавить объект"); _logger.LogError("Ошибка: {Message}", ex.Message); } + + catch (ObjectIsEqualException ex) + { + MessageBox.Show("Не удалось добавить объект потому что он уже существует!"); + _logger.LogError("Ошибка: {Message}", ex.Message); + } } /// @@ -171,7 +177,7 @@ public partial class FormPlaneCollection : Form 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); @@ -318,5 +324,39 @@ public partial class FormPlaneCollection : Form } } } + + /// + /// Сортировка по типу + /// + /// + /// + private void buttonSortByType_Click(object sender, EventArgs e) + { + ComparePlanes(new PlaneCompareByType()); + } + /// + /// Cортировка по цвету + /// + /// + /// + private void buttonSortByColor_Click(object sender, EventArgs e) + { + ComparePlanes(new PlaneCompareByColor()); + } + + /// + /// Сортировка по сравнителю + /// + /// Сравнитель объектов + private void ComparePlanes(IComparer comparer) + { + if (_company == null) + { + return; + } + _company.Sort(comparer); + pictureBox.Image = _company.Show(); + } + } diff --git a/Отчет Эгов курсач.docx b/Отчет Эгов курсач.docx new file mode 100644 index 0000000..e0dabc7 Binary files /dev/null and b/Отчет Эгов курсач.docx differ diff --git a/Презентация по курсачу.pptx b/Презентация по курсачу.pptx new file mode 100644 index 0000000..118e153 Binary files /dev/null and b/Презентация по курсачу.pptx differ