using System; using RoadTrain.Exceptions; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace RoadTrain.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 int Insert(T train) { return Insert(train, 0); } /// /// Добавление объекта в набор на конкретную позицию /// /// Добавляемый автомобиль /// Позиция /// public int Insert(T train, int position) { if (position < 0 || position >= _maxCount) throw new StorageOverflowException("Невалидная операция"); if (Count >= _maxCount) throw new StorageOverflowException(_maxCount); _places.Insert(position, train); return position; } /// /// Удаление объекта из набора с конкретной позиции /// /// /// public bool Remove(int position) { if (position >= Count || position < 0) { throw new TrainNotFoundException("Невалидная операция"); } if (_places[position] == null) { throw new TrainNotFoundException(position); } _places[position] = null; return true; } /// /// Получение объекта из набора по позиции /// /// /// public T? this[int position] { get { if ((position < 0) || (position >= Count)) return null; return _places[position]; } set { if ((position < 0) || (position > _maxCount)) return; _places[position] = value; } } public IEnumerable GetTrains(int? maxTrains = null) { for (int i = 0; i < _places.Count; ++i) { yield return _places[i]; if (maxTrains.HasValue && i == maxTrains.Value) { yield break; } } } } }