namespace FlexArray; public sealed class FlexArrayInt { public const int DefaultStartSize = 4; private int[] _data; public int Count { get; private set; } public int Capacity => _data.Length; public int this[int index] { get { if (index < 0 || index > Count) { return -1; } return _data[index]; } } public bool Remove(int value, bool firstOnly) { var removedAny = false; for (var i = 0; i < Count; i++) { if (value != _data[i]) { continue; } RemoveAt(i--); removedAny = true; if (firstOnly) { break; } } return removedAny; } public bool RemoveAt(int index) { if (index < 0 || index >= Count) { return false; } if (index != Count - 1) { ShiftLeft(index); } Count--; return true; } private void ShiftLeft(int fromIndex) { for (var i = fromIndex; i < Count; i++) { _data[i] = _data[i + 1]; } } public FlexArrayInt(int? initialSize = null) { var size = Math.Max(0, initialSize ?? DefaultStartSize); _data = new int[size]; } public void Add(int value) { if (Capacity == Count) { Grow(); } _data[Count++] = value; } public bool Contains(int value) { if (Count == 0) { return false; } for (var i = 0; i < Count; i++) { if (_data[i] == value) { return true; } } return false; } private void Grow() { var newData = new int[Capacity * 2]; Array.Copy(_data, newData, Count); _data = newData; } }