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