From bf21edec3e4c3c2a81023d81bd84a89583a68775 Mon Sep 17 00:00:00 2001 From: Tonb73 Date: Sun, 12 May 2024 10:58:04 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D0=B5?= =?UTF-8?q?=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AbstractCompany.cs | 3 +- .../ListGenericObjects.cs | 23 +++++++++- .../MassiveGenericObjects.cs | 23 +++++++++- .../StorageCollection.cs | 22 +++++---- .../Drawnings/DrawingLocomotiveEqutables.cs | 21 +++++++-- .../DrawningLocomotiveCompareByColor.cs | 45 ++++++++++++++----- .../CollectionDuplicateException.cs | 21 +++++++++ .../Exceptions/DrawningEqutablesException.cs | 20 +++++++++ 8 files changed, 150 insertions(+), 28 deletions(-) create mode 100644 ProjectElectricLocomotive/Exceptions/CollectionDuplicateException.cs create mode 100644 ProjectElectricLocomotive/Exceptions/DrawningEqutablesException.cs diff --git a/ProjectElectricLocomotive/CollectionGenericObjects/AbstractCompany.cs b/ProjectElectricLocomotive/CollectionGenericObjects/AbstractCompany.cs index 1e6b4d2..92b97c9 100644 --- a/ProjectElectricLocomotive/CollectionGenericObjects/AbstractCompany.cs +++ b/ProjectElectricLocomotive/CollectionGenericObjects/AbstractCompany.cs @@ -1,4 +1,5 @@ using ProjectElectricLocomotive.Drawnings; +using ProjectElectricLocomotive.Exceptions; using System; using System.Collections.Generic; using System.Linq; @@ -62,7 +63,7 @@ public abstract class AbstractCompany public static int operator +(AbstractCompany company, DrawningLocomotive locomotive) { - return company._collection.Insert(locomotive, new DrawiningLocomotiveEqutables()) ?? false; + return company._collection?.Insert(locomotive, new DrawiningLocomotiveEqutables()) ?? throw new DrawningEqutablesException(); } /// /// Перегрузка оператора удаления для класса diff --git a/ProjectElectricLocomotive/CollectionGenericObjects/ListGenericObjects.cs b/ProjectElectricLocomotive/CollectionGenericObjects/ListGenericObjects.cs index 0ea64ee..52bb216 100644 --- a/ProjectElectricLocomotive/CollectionGenericObjects/ListGenericObjects.cs +++ b/ProjectElectricLocomotive/CollectionGenericObjects/ListGenericObjects.cs @@ -60,6 +60,17 @@ namespace ProjectElectricLocomotive.CollectionGenericObjects // выброс ошибки если переполнение //выброс ошибки если такой объект уже есть в коллекции + if(comparer != null) + { + for(int i = 0; i < Count; i++) + { + if (comparer.Equals(_collection[i], obj)) + { + throw new CollectionDuplicateException(obj); + } + } + } + if (Count == _maxCount) throw new CollectionOverflowException(Count); _collection.Add(obj); return Count; @@ -73,6 +84,16 @@ namespace ProjectElectricLocomotive.CollectionGenericObjects // выброс ошибки, если переполнение // выброс ошибки если выход за границу //выброс ошибки если такой объект уже есть в коллекции + if (comparer != null) + { + for (int i = 0; i < Count; i++) + { + if (comparer.Equals(_collection[i], obj)) + { + throw new CollectionDuplicateException(obj); + } + } + } if (Count == _maxCount) throw new CollectionOverflowException(Count); @@ -106,7 +127,7 @@ namespace ProjectElectricLocomotive.CollectionGenericObjects public void CollectionSort(IComparer comparer) { _collection.Sort(comparer); - throw new NotImplementedException(); + // throw new NotImplementedException(); } } } diff --git a/ProjectElectricLocomotive/CollectionGenericObjects/MassiveGenericObjects.cs b/ProjectElectricLocomotive/CollectionGenericObjects/MassiveGenericObjects.cs index 0cb1f62..31198e8 100644 --- a/ProjectElectricLocomotive/CollectionGenericObjects/MassiveGenericObjects.cs +++ b/ProjectElectricLocomotive/CollectionGenericObjects/MassiveGenericObjects.cs @@ -63,6 +63,17 @@ namespace ProjectElectricLocomotive.CollectionGenericObjects //выброс ошибки, если выход за границы массива //выброс ошибки если такой объект уже есть в коллекции + if(comparer != null) + { + for(int i = 0; i < Count; i++) + { + if (comparer.Equals(_collection[i], obj)) + { + throw new CollectionDuplicateException(obj); + } + } + } + for (int i = 0; i < Count; i++) { if (_collection[i] == null) @@ -84,6 +95,16 @@ namespace ProjectElectricLocomotive.CollectionGenericObjects //выброс ошибки, если выход за границы массива //выброс ошибки если такой объект уже есть в коллекции if (position >= Count || position < 0) throw new PositionOutOfCollectionException(position); + if(comparer != null) + { + for(int i = 0; i < Count; i++) + { + if (comparer.Equals(_collection[i], obj)) + { + throw new CollectionDuplicateException(obj); + } + } + } if (_collection[position] == null) { @@ -135,7 +156,7 @@ namespace ProjectElectricLocomotive.CollectionGenericObjects public void CollectionSort(IComparer comparer) { Array.Sort(_collection, comparer); - throw new NotImplementedException(); + // throw new NotImplementedException(); } } } diff --git a/ProjectElectricLocomotive/CollectionGenericObjects/StorageCollection.cs b/ProjectElectricLocomotive/CollectionGenericObjects/StorageCollection.cs index 1aed8cf..88ce44a 100644 --- a/ProjectElectricLocomotive/CollectionGenericObjects/StorageCollection.cs +++ b/ProjectElectricLocomotive/CollectionGenericObjects/StorageCollection.cs @@ -36,20 +36,18 @@ where T : DrawningLocomotive /// /// Название коллекции /// тип коллекции - public void AddCollection(string name, CollectionType collectionType) + public void AddCollection(CollectionInfo collectionInfo) { - if(collectionType != CollectionType.None && !_storages.ContainsKey(name)) { - if(collectionType == CollectionType.List) - { - _storages.Add(name, new ListGenericObjects()); - } - else if (collectionType == CollectionType.Massive) - { - _storages.Add(name, new MassiveGenericObjects()); - } - } // TODO проверка, что name не пустой и нет в словаре записи с таким ключом - // TODO Прописать логику для добавления + // TODO Прописать логику для добавления + if (_storages.ContainsKey(collectionInfo)) throw new CollectionExistsException(collectionInfo); + if (collectionInfo.CollectionType == CollectionType.None) + throw new CollectionNoTypeException("Пустой тип коллекции"); + if (collectionInfo.CollectionType == CollectionType.Massive) + _storages[collectionInfo] = new MassiveGenericObjects(); + else if (collectionInfo.CollectionType == CollectionType.List) + _storages[collectionInfo] = new ListGenericObjects(); + } /// /// Удаление коллекции diff --git a/ProjectElectricLocomotive/Drawnings/DrawingLocomotiveEqutables.cs b/ProjectElectricLocomotive/Drawnings/DrawingLocomotiveEqutables.cs index 8693a10..35aef01 100644 --- a/ProjectElectricLocomotive/Drawnings/DrawingLocomotiveEqutables.cs +++ b/ProjectElectricLocomotive/Drawnings/DrawingLocomotiveEqutables.cs @@ -1,4 +1,5 @@ -using System; +using ProjectElectricLocomotive.Entities; +using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Linq; @@ -40,10 +41,24 @@ public class DrawiningLocomotiveEqutables : IEqualityComparer -/// Сравнение по цвету, скорости, весу -/// -public class DrawningLocomotiveCompareByColor : IComparer -{ -public int Compare(DrawningLocomotive? x, DrawningLocomotive? y) -{ -// TODO прописать логику сравения по цветам, скорости, весу -throw new NotImplementedException(); -} -} + /// Сравнение по цвету, скорости, весу + /// + public class DrawningLocomotiveCompareByColor : IComparer + { + public int Compare(DrawningLocomotive? x, DrawningLocomotive? y) + { + if (x == null && y == null) return 0; + if (x == null || x.EntityLocomotive == null) + { + return 1; + } + + if (y == null || y.EntityLocomotive == null) + { + return -1; + } + + if (ToHex(x.EntityLocomotive.BodyColor) != ToHex(y.EntityLocomotive.BodyColor)) + { + return String.Compare(ToHex(x.EntityLocomotive.BodyColor), ToHex(y.EntityLocomotive.BodyColor), + StringComparison.Ordinal); + } + + var speedCompare = x.EntityLocomotive.Speed.CompareTo(y.EntityLocomotive.Speed); + if (speedCompare != 0) + { + return speedCompare; + } + + return x.EntityLocomotive.Weight.CompareTo(y.EntityLocomotive.Weight); + } + + private static String ToHex(Color c) => $"#{c.R:X2}{c.G:X2}{c.B:X2}"; + } } + diff --git a/ProjectElectricLocomotive/Exceptions/CollectionDuplicateException.cs b/ProjectElectricLocomotive/Exceptions/CollectionDuplicateException.cs new file mode 100644 index 0000000..7ccbcd2 --- /dev/null +++ b/ProjectElectricLocomotive/Exceptions/CollectionDuplicateException.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.Serialization; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectElectricLocomotive.Exceptions +{ + public class CollectionDuplicateException : Exception + { + public CollectionDuplicateException(object obj) : base("Объект " + obj + " не является уникальным") { } + public CollectionDuplicateException() : base() { } + public CollectionDuplicateException(string message) : base(message) { } + public CollectionDuplicateException(string message, Exception exception) : + base(message, exception) + { } + protected CollectionDuplicateException(SerializationInfo info, StreamingContext + contex) : base(info, contex) { } + } +} diff --git a/ProjectElectricLocomotive/Exceptions/DrawningEqutablesException.cs b/ProjectElectricLocomotive/Exceptions/DrawningEqutablesException.cs new file mode 100644 index 0000000..f914f47 --- /dev/null +++ b/ProjectElectricLocomotive/Exceptions/DrawningEqutablesException.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 ProjectElectricLocomotive.Exceptions +{ + public class DrawningEqutablesException : Exception + { + public DrawningEqutablesException() : base("Оба объекта прорисовки одинаковые") { } + public DrawningEqutablesException(string message) : base(message) { } + public DrawningEqutablesException(string message, Exception exception) : + base(message, exception) + { } + protected DrawningEqutablesException(SerializationInfo info, StreamingContext + contex) : base(info, contex) { } + } +}