using System.Runtime.Remoting; namespace ProjectElectroTrans.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) { if (_collection.Length > 0) { Array.Resize(ref _collection, value); } else { _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 bool Insert(T obj) { // вставка в свободное место набора for (int i = 0; i< Count; i++) { if (_collection[i] == null) { _collection[i] = obj; return true; } } return false; } public bool Insert(T obj, int position) { // проверка позиции if (position < 0 || position >= Count) { return false; } // проверка, что элемент массива по этой позиции пустой, если нет, то // ищется свободное место после этой позиции и идет вставка туда // если нет после, ищем до 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 false; } } // вставка _collection[position] = obj; return false; } public bool Remove(int position) { // проверка позиции if (position < 0 || position >= Count) { return false; } // удаление объекта из массива, присвоив элементу массива значение null _collection[position] = null; return true; } }