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