diff --git a/ProjectMotorBoat/ProjectMotorBoat/CollectionGenericObjects/AbstractCompany.cs b/ProjectMotorBoat/ProjectMotorBoat/CollectionGenericObjects/AbstractCompany.cs index b51eee6..b6ade53 100644 --- a/ProjectMotorBoat/ProjectMotorBoat/CollectionGenericObjects/AbstractCompany.cs +++ b/ProjectMotorBoat/ProjectMotorBoat/CollectionGenericObjects/AbstractCompany.cs @@ -64,7 +64,7 @@ public abstract class AbstractCompany /// public static int operator +(AbstractCompany company, DrawningBoat boat) { - return company._collection.Insert(boat); + return company._collection.Insert(boat, new DrawiningBoatEqutables()); } /// diff --git a/ProjectMotorBoat/ProjectMotorBoat/CollectionGenericObjects/ICollectionGenericObjects.cs b/ProjectMotorBoat/ProjectMotorBoat/CollectionGenericObjects/ICollectionGenericObjects.cs index 87947a5..3dfa33a 100644 --- a/ProjectMotorBoat/ProjectMotorBoat/CollectionGenericObjects/ICollectionGenericObjects.cs +++ b/ProjectMotorBoat/ProjectMotorBoat/CollectionGenericObjects/ICollectionGenericObjects.cs @@ -25,16 +25,18 @@ public interface ICollectionGenericObjects /// Добавление объекта в коллекцию /// /// Добавляемый объект + /// /// Cравнение двух объектов /// true - вставка прошла удачно, false - вставка не удалась - int Insert(T obj); + int Insert(T obj, IEqualityComparer? comparer = null); /// /// Добавление объекта в коллекцию на конкретную позицию /// ///Добавляемый объект /// Позиция + /// /// Cравнение двух объектов /// true - вставка прошла удачно, false - вставка не удалась - int Insert(T obj, int position); + int Insert(T obj, int position, IEqualityComparer? comparer = null); /// /// Удаление объекта из коллекции с конкретной позиции diff --git a/ProjectMotorBoat/ProjectMotorBoat/CollectionGenericObjects/ListGenericObjects.cs b/ProjectMotorBoat/ProjectMotorBoat/CollectionGenericObjects/ListGenericObjects.cs index e169041..1d3a5c4 100644 --- a/ProjectMotorBoat/ProjectMotorBoat/CollectionGenericObjects/ListGenericObjects.cs +++ b/ProjectMotorBoat/ProjectMotorBoat/CollectionGenericObjects/ListGenericObjects.cs @@ -59,11 +59,16 @@ public class ListGenericObjects : ICollectionGenericObjects } return _collection[position]; } - public int Insert(T obj) + public int Insert(T obj, IEqualityComparer? comparer = null) { - // todo выброс ошибки если переплонение + /// todo выброс ошибки если переплонение /// TODO проверка, что не превышено максимальное количество элементов + // todo выброс ошибки если такой объект есть в коллекции + if (_collection.Contains(obj, comparer)) + { + throw new ArgumentException("Добавляемый объект уже существует в коллекции"); + } /// TODO вставка в конец набора if (_maxCount <= Count) { @@ -77,15 +82,20 @@ public class ListGenericObjects : ICollectionGenericObjects } - public int Insert(T obj, int position) + public int Insert(T obj, int position, IEqualityComparer? comparer = null) { /// TODO проверка, что не превышено максимальное количество элементов /// TODO проверка позиции /// TODO вставка по позиции + // todo выброс ошибки если такой объект есть в коллекции if (_maxCount <= Count) { throw new CollectionOverflowException(Count); } + if (_collection.Contains(obj, comparer)) + { + throw new ArgumentException("Добавляемый объект уже существует в коллекции"); + } if (position < 0 || position >= Count) { throw new PositionOutOfCollectionException(position); diff --git a/ProjectMotorBoat/ProjectMotorBoat/CollectionGenericObjects/MassiveGenericObjects.cs b/ProjectMotorBoat/ProjectMotorBoat/CollectionGenericObjects/MassiveGenericObjects.cs index 756adfc..52e97b9 100644 --- a/ProjectMotorBoat/ProjectMotorBoat/CollectionGenericObjects/MassiveGenericObjects.cs +++ b/ProjectMotorBoat/ProjectMotorBoat/CollectionGenericObjects/MassiveGenericObjects.cs @@ -61,47 +61,19 @@ public class MassiveGenericObjects : ICollectionGenericObjects if (_collection[position] == null) throw new ObjectNotFoundException(position); return _collection[position]; } - public int Insert(T obj) - //todo выброс ошибки если переполнение + public int Insert(T obj, IEqualityComparer? comparer = null) + // todo выброс ошибки если такой объект есть в коллекции + ///todo выброс ошибки если переполнение ///to do - { - for (int i = 0; i < _collection.Length; i++) - { - if (_collection[i] == null) - { - _collection[i] = obj; - return i; - } - } - throw new CollectionOverflowException(Count); - } - public int Insert(T obj, int position) - //todo выброс ошибки если переполнение - // todo выброс ошибки если выход за границы массива - ///to do - { - if (position < 0 || position >= _collection.Length) - { - throw new PositionOutOfCollectionException(position); - } - if (_collection[position] == null) + { + if (_collection.Contains(obj, comparer)) { - _collection[position] = obj;//вставка - return position; + throw new ArgumentException("Добавляемый объект уже существует в коллекции"); } else { - for (int i = position + 1; i < _collection.Length; i++) - { - if (_collection[i] == null) - { - _collection[i] = obj;//вставка - return i; - } - } - - for (int i = position - 1; i >= 0; i--) + for (int i = 0; i < _collection.Length; i++) { if (_collection[i] == null) { @@ -109,8 +81,54 @@ public class MassiveGenericObjects : ICollectionGenericObjects return i; } } + throw new CollectionOverflowException(Count); + } + } + public int Insert(T obj, int position, IEqualityComparer? comparer = null) + // todo выброс ошибки если такой объект есть в коллекции + + ///todo выброс ошибки если переполнение + /// todo выброс ошибки если выход за границы массива + ///to do + { + if (_collection.Contains(obj, comparer)) + { + throw new ArgumentException("Добавляемый объект уже существует в коллекции"); + } + else + { + if (position < 0 || position >= _collection.Length) + { + throw new PositionOutOfCollectionException(position); + } + + if (_collection[position] == null) + { + _collection[position] = obj;//вставка + return position; + } + else + { + for (int i = position + 1; i < _collection.Length; i++) + { + if (_collection[i] == null) + { + _collection[i] = obj;//вставка + return i; + } + } + + for (int i = position - 1; i >= 0; i--) + { + if (_collection[i] == null) + { + _collection[i] = obj; + return i; + } + } + } + throw new CollectionOverflowException(Count); } - throw new CollectionOverflowException(Count); } public T Remove(int position) //todo выброс ошибки если выход за границы массива diff --git a/ProjectMotorBoat/ProjectMotorBoat/Drawnings/DrawiningBoatEqutables.cs b/ProjectMotorBoat/ProjectMotorBoat/Drawnings/DrawiningBoatEqutables.cs new file mode 100644 index 0000000..82f0f9a --- /dev/null +++ b/ProjectMotorBoat/ProjectMotorBoat/Drawnings/DrawiningBoatEqutables.cs @@ -0,0 +1,69 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Diagnostics.CodeAnalysis; +using ProjectMotorBoat.Entities; + +namespace ProjectMotorBoat.Drawnings; + +/// +/// Реализация сравнения двух объектов класса-прорисовки +/// +public class DrawiningBoatEqutables : IEqualityComparer +{ + public bool Equals(DrawningBoat? x, DrawningBoat? y) + { + if (x == null || x.EntityBoat == null) + { + return false; + } + if (y == null || y.EntityBoat == null) + { + return false; + } + if (x.GetType().Name != y.GetType().Name) + { + return false; + } + if (x.EntityBoat.Speed != y.EntityBoat.Speed) + { + return false; + } + if (x.EntityBoat.Weight != y.EntityBoat.Weight) + { + return false; + } + if (x.EntityBoat.BodyColor != y.EntityBoat.BodyColor) + { + return false; + } + if (x is DrawningMotorBoat && y is DrawningMotorBoat) + { + // TODO доделать логику сравнения дополнительных параметров + EntityMotorBoat _x = (EntityMotorBoat)x.EntityBoat; + EntityMotorBoat _y = (EntityMotorBoat)y.EntityBoat; + + if (_x.AdditionalColor != _y.AdditionalColor) + { + return false; + } + if (_x.Glass != _y.Glass) + { + return false; + } + if (_x.Engine != _y.Engine) + { + return false; + } + + } + return true; + } + + public int GetHashCode([DisallowNull] DrawningBoat obj) + { + return obj.GetHashCode(); + } +} diff --git a/ProjectMotorBoat/ProjectMotorBoat/Drawnings/DrawningBoatCompareByColor.cs b/ProjectMotorBoat/ProjectMotorBoat/Drawnings/DrawningBoatCompareByColor.cs new file mode 100644 index 0000000..5341136 --- /dev/null +++ b/ProjectMotorBoat/ProjectMotorBoat/Drawnings/DrawningBoatCompareByColor.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Security.Cryptography.Xml; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectMotorBoat.Drawnings; + +/// +/// Сравнение по цвету, скорости, весу +/// +public class DrawningBoatCompareByColor : IComparer +{ + public int Compare(DrawningBoat? x, DrawningBoat? y) + { + // TODO прописать логику сравения по цветам, скорости, весу + if (x.EntityBoat.BodyColor != y.EntityBoat.BodyColor) + { + return -1; + } + var speedCompare = x.EntityBoat.Speed.CompareTo(y.EntityBoat.Speed); + if (speedCompare != 0) + { + return speedCompare; + } + return x.EntityBoat.Weight.CompareTo(y.EntityBoat.Weight); + } +} diff --git a/ProjectMotorBoat/ProjectMotorBoat/Drawnings/DrawningBoatCompareByType.cs b/ProjectMotorBoat/ProjectMotorBoat/Drawnings/DrawningBoatCompareByType.cs new file mode 100644 index 0000000..64cda83 --- /dev/null +++ b/ProjectMotorBoat/ProjectMotorBoat/Drawnings/DrawningBoatCompareByType.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectMotorBoat.Drawnings; + +/// +/// Сравнение по типу, скорости, весу +/// +public class DrawningBoatCompareByType : IComparer +{ + public int Compare(DrawningBoat? x, DrawningBoat? y) + { + if (x == null || x.EntityBoat == null) + { + return -1; + } + if (y == null || y.EntityBoat == null) + { + return 1; + } + if (x.GetType().Name != y.GetType().Name) + { + return x.GetType().Name.CompareTo(y.GetType().Name); + } + var speedCompare = x.EntityBoat.Speed.CompareTo(y.EntityBoat.Speed); + if (speedCompare != 0) + { + return speedCompare; + } + return x.EntityBoat.Weight.CompareTo(y.EntityBoat.Weight); + } +}