Лабораторная работа 8(не все)

This commit is contained in:
asakky 2024-05-05 21:56:46 +04:00
parent 61d1f66176
commit e8aba23eed
7 changed files with 205 additions and 42 deletions

View File

@ -64,7 +64,7 @@ public abstract class AbstractCompany
/// <returns></returns>
public static int operator +(AbstractCompany company, DrawningBoat boat)
{
return company._collection.Insert(boat);
return company._collection.Insert(boat, new DrawiningBoatEqutables());
}
/// <summary>

View File

@ -25,16 +25,18 @@ public interface ICollectionGenericObjects<T>
/// Добавление объекта в коллекцию
/// </summary>
/// <param name="obj">Добавляемый объект</param>
/// /// <param name="comparer">Cравнение двух объектов</param>
/// <returns>true - вставка прошла удачно, false - вставка не удалась</returns>
int Insert(T obj);
int Insert(T obj, IEqualityComparer<T?>? comparer = null);
/// <summary>
/// Добавление объекта в коллекцию на конкретную позицию
/// </summary>
///<param name="obj">Добавляемый объект</param>
/// <param name="position">Позиция</param>
/// /// <param name="comparer">Cравнение двух объектов</param>
/// <returns>true - вставка прошла удачно, false - вставка не удалась</returns>
int Insert(T obj, int position);
int Insert(T obj, int position, IEqualityComparer<T?>? comparer = null);
/// <summary>
/// Удаление объекта из коллекции с конкретной позиции

View File

@ -59,11 +59,16 @@ public class ListGenericObjects<T> : ICollectionGenericObjects<T>
}
return _collection[position];
}
public int Insert(T obj)
public int Insert(T obj, IEqualityComparer<T?>? 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<T> : ICollectionGenericObjects<T>
}
public int Insert(T obj, int position)
public int Insert(T obj, int position, IEqualityComparer<T?>? 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);

View File

@ -61,47 +61,19 @@ public class MassiveGenericObjects<T> : ICollectionGenericObjects<T>
if (_collection[position] == null) throw new ObjectNotFoundException(position);
return _collection[position];
}
public int Insert(T obj)
//todo выброс ошибки если переполнение
public int Insert(T obj, IEqualityComparer<T?>? 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<T> : ICollectionGenericObjects<T>
return i;
}
}
throw new CollectionOverflowException(Count);
}
}
public int Insert(T obj, int position, IEqualityComparer<T?>? 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 выброс ошибки если выход за границы массива

View File

@ -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;
/// <summary>
/// Реализация сравнения двух объектов класса-прорисовки
/// </summary>
public class DrawiningBoatEqutables : IEqualityComparer<DrawningBoat?>
{
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();
}
}

View File

@ -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;
/// <summary>
/// Сравнение по цвету, скорости, весу
/// </summary>
public class DrawningBoatCompareByColor : IComparer<DrawningBoat?>
{
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);
}
}

View File

@ -0,0 +1,35 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectMotorBoat.Drawnings;
/// <summary>
/// Сравнение по типу, скорости, весу
/// </summary>
public class DrawningBoatCompareByType : IComparer<DrawningBoat?>
{
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);
}
}