using System; using System.Collections; namespace Core { public class GenericList : IEnumerable { private T[] _items; private int _count; public GenericList() { _items = new T[1]; _count = 0; } public int Count { get { return _count; } } public void Add(T item) { if (_count == _items.Length) { T[] expandedArray = new T[_items.Length * 2]; for (int i = 0; i < _items.Length; i++) { expandedArray[i] = _items[i]; } _items = expandedArray; } _items[_count] = item; _count++; } public T GetAt(int index) { if (index < 0 || index >= _count) { throw new ArgumentException(); } return _items[index]; } public void RemoveAt(int index) { int idx = 0; T[] newOutputArray = new T[_items.Length]; for (int i = 0; i < _items.Length; i++) { if (i == index) { i++; } if (i < _items.Length) { newOutputArray[idx] = _items[i]; idx++; } } _items = newOutputArray; _count--; } public bool Remove(T item) { T[] tempArray = new T[_items.Length]; int idx = 0; int i = 0; bool found = false; if (IsInList(_items, item)) { while (i < _items.Length && !found) { if (!object.Equals(_items[i], item)) { tempArray[idx] = _items[i]; idx++; } else { found = true; } i++; } while (i < _items.Length) { tempArray[idx] = _items[i]; idx++; i++; } _items = tempArray; _count--; return true; } return false; } public void Insert(int index, T item) { int idx = 0; if (index == _count) { Add(item); } else if (index >= 0 && index < _count) { if (_count == _items.Length) { T[] tempExpandedArr = new T[_items.Length * 2]; for (int i = 0; i < _items.Length;) { if (index != idx) { tempExpandedArr[idx] = _items[i]; idx++; i++; } else { tempExpandedArr[idx] = item; idx++; } } _items = tempExpandedArr; _count++; } } else { throw new ArgumentException(); } } private bool IsInList(T[] arr, T obj) { for (int i = 0; i < arr.Length; i++) { if (object.Equals(arr[i], obj)) { return true; } } return false; } IEnumerator IEnumerable.GetEnumerator() { return (IEnumerator)GetEnumerator(); } public IEnumerator GetEnumerator() { return new GenericListEnumerator(_items); } } }