From ad9095167319fb076e064aafef8485401f4b0955 Mon Sep 17 00:00:00 2001 From: Garifullin-Farid <95081032+Garifullin-Farid@users.noreply.github.com> Date: Sun, 17 Mar 2024 16:11:32 +0400 Subject: [PATCH] =?UTF-8?q?=D0=9A=D0=BE=D0=BB=D0=BB=D0=B5=D0=BA=D1=86?= =?UTF-8?q?=D0=B8=D0=B8=20=D0=BE=D0=B1=D1=8A=D0=B5=D0=BA=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ICollectionGenericObjects.cs | 49 ++++++++ .../MassiveGenericObjects.cs | 113 ++++++++++++++++++ 2 files changed, 162 insertions(+) create mode 100644 ProjectTank/ProjectTank/CollectionGenericObjects/ICollectionGenericObjects.cs create mode 100644 ProjectTank/ProjectTank/CollectionGenericObjects/MassiveGenericObjects.cs diff --git a/ProjectTank/ProjectTank/CollectionGenericObjects/ICollectionGenericObjects.cs b/ProjectTank/ProjectTank/CollectionGenericObjects/ICollectionGenericObjects.cs new file mode 100644 index 0000000..812597b --- /dev/null +++ b/ProjectTank/ProjectTank/CollectionGenericObjects/ICollectionGenericObjects.cs @@ -0,0 +1,49 @@ +namespace ProjectTank.CollectionGenericObjects +{ + /// <summary> + /// Интерфейс описания действий для набора хранимых данных + /// </summary> + /// <typeparam name="T"></typeparam> + public interface ICollectionGenericObjects<T> + where T : class + { + /// <summary> + /// Количество объектов в коллекции + /// </summary> + int Count { get; } + + /// <summary> + /// Установка максимального количества элементов + /// </summary> + int SetMaxCount { set; } + + /// <summary> + /// Добавление объекта в коллекцию + /// </summary> + /// <param name="obj">Добавляемый объект</param> + /// <returns>true - вставка прошла удачно, false - вставка не удалась</returns> + int Insert(T obj); + + /// <summary> + /// Добавление объекта в коллекцию на конкретную позицию + /// </summary> + /// <param name="obj">Добавляемый объект</param> + /// <param name="position">Позиция</param> + /// <returns>true - вставка прошла удачно, false - вставка не удалась</returns> + int Insert(T obj, int position); + + /// <summary> + /// Удаление объекта из коллекции с конкретной позиции + /// </summary> + /// <param name="position">Позиция</param> + /// <returns>true - удаление прошло удачно, false - удаление не удалось</returns> + T? Remove(int position); + + /// <summary> + /// Получение объекта по позиции + /// </summary> + /// <param name="position">Позиция</param> + /// <returns>Объект</returns> + T? Get(int position); + } +} diff --git a/ProjectTank/ProjectTank/CollectionGenericObjects/MassiveGenericObjects.cs b/ProjectTank/ProjectTank/CollectionGenericObjects/MassiveGenericObjects.cs new file mode 100644 index 0000000..4326cf4 --- /dev/null +++ b/ProjectTank/ProjectTank/CollectionGenericObjects/MassiveGenericObjects.cs @@ -0,0 +1,113 @@ +using ProjectTank.CollectionGenericObjects; +/// <summary> +/// Параметризованный набор объектов +/// </summary> +/// <typeparam name="T">Параметр: ограничение - ссылочный тип</typeparam> +public class MassiveGenericObjects<T> : ICollectionGenericObjects<T> + where T : class +{ + /// <summary> + /// Массив объектов, которые храним + /// </summary> + private T?[] _collection; + + public int Count => _collection.Length; + + public int SetMaxCount { set { if (value > 0) { _collection = new T?[value]; } } } + + /// <summary> + /// Конструктор + /// </summary> + public MassiveGenericObjects() + { + _collection = Array.Empty<T?>(); + } + + public T? Get(int position) + { + if (position >= 0 && position < Count) + { + return _collection[position]; + } + + return null; + } + + public int Insert(T obj) + { + // вставка в свободное место набора + for (int i = 0; i < Count; i++) + { + if (_collection[i] == null) + { + _collection[i] = obj; + return i; + } + } + + return -1; + } + + public int Insert(T obj, int position) + { + // проверка позиции + if (position < 0 || position >= Count) + { + return -1; + } + + // проверка, что элемент массива по этой позиции пустой, если нет, то + // ищется свободное место после этой позиции и идет вставка туда + // если нет после, ищем до + if (_collection[position] != null) + { + bool pushed = false; + for (int index = position + 1; index < Count; index++) + { + if (_collection[index] == null) + { + position = index; + pushed = true; + break; + } + } + + if (!pushed) + { + for (int index = position - 1; index >= 0; index--) + { + if (_collection[index] == null) + { + position = index; + pushed = true; + break; + } + } + } + + if (!pushed) + { + return position; + } + } + + // вставка + _collection[position] = obj; + return position; + } + + public T? Remove(int position) + { + // проверка позиции + if (position < 0 || position >= Count) + { + return null; + } + + if (_collection[position] == null) return null; + + T? temp = _collection[position]; + _collection[position] = null; + return temp; + } +} \ No newline at end of file