using Cruiser.Exceptions; using System; using System.Collections.Generic; using System.Diagnostics.Eventing.Reader; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Cruiser.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 cruiser, IEqualityComparer? equal = null) //починил код, работал неправильно, переделал на инт { if (_places.Count >= _maxCount) { throw new StorageOverflowException(_places.Count); } return Insert(cruiser, 0, equal); } /// /// Удаление объекта из набора с конкретной позиции /// /// /// public bool Remove(int position) { if (position < 0 || position > _places.Count) { throw new CruiserNotFoundException(position); } _places[position] = null; return true; } /// /// Добавление объекта в набор на конкретную позицию /// /// Добавляемый автомобиль /// Позиция /// public bool Insert(T cruiser, int position, IEqualityComparer? equal = null) //починил код, работал неправильно, переделал на инт { if (position < 0 || position > Count) throw new CruiserNotFoundException(position); if (Count >= _maxCount) throw new StorageOverflowException(_maxCount); if (equal != null && _places.Contains(cruiser, equal)) throw new ArgumentException("Круизер уже имеется"); _places.Insert(position, cruiser); return true; } public T? this[int position] { get { if (position < 0 || position > _maxCount) { return null; } return _places[position]; } set { if (position < 0 || position > _maxCount) return; _places[position] = value; } } public IEnumerable GetCruisers(int? maxCruisers = null) { for (int i = 0; i < _places.Count; ++i) { yield return _places[i]; if (maxCruisers.HasValue && i == maxCruisers.Value) { yield break; } } } public void SortSet(IComparer comparer) => _places.Sort(comparer); } }