using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Liner.Generics { /// /// Параметризованный набор объектов /// /// public class SetGeneric where T : class { /// /// Массив объектов, которые храним /// private readonly List _places; /// /// Количество объектов в массиве /// public int Count => _places.Capacity; /// /// Максимальное количество объектов в списке /// private readonly int _maxCount; /// /// Конструктор /// /// public SetGeneric(int count) { _maxCount = count; _places = new List(count); } /// /// Добавление объекта в набор /// /// Добавляемый лайнер /// public int Insert(T liner) { if (_places.Count + 1 <= _maxCount) { _places.Insert(0, liner); return 0; } return -1; } /// /// Добавление объекта в набор на конкретную позицию /// /// Добавляемый лайнер /// Позиция /// public int Insert(T liner, int position) { if (_places.Count + 1 <= _maxCount && _places.Count >= position) { _places.Insert(position, liner); return position; } return -1; } /// /// Удаление объекта из набора с конкретной позиции /// /// /// public bool Remove(int position) { if(_places.Count > position && position >= 0) { _places.RemoveAt(position); return true; } return false; } /// /// Получение объекта из набора по позиции /// /// /// public T? this[int position] { get { if (_places.Count > position && position >= 0) { return _places[position]; } return null; } set { if(_places.Count + 1 <= _maxCount && position >= 0 && _places.Count > position) { _places[position] = value; } } } /// /// Проход по списку /// /// public IEnumerable GetLiners(int? maxLiners = null) { for (int i = 0; i < _places.Count; ++i) { yield return _places[i]; if (maxLiners.HasValue && i == maxLiners.Value) { yield break; } } } } }