using System; using System.Collections; using System.Collections.Generic; namespace BITKit { public sealed class CacheList : IList { private readonly IList _listImplementation = new List(); private T[] _array = Array.Empty(); private bool _isDirty = true; public IEnumerator GetEnumerator() { CheckChanges(); return _listImplementation.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { CheckChanges(); return ((IEnumerable)_listImplementation).GetEnumerator(); } public void Add(T item) { //CheckChanges(); _listImplementation.Add(item); } public void Clear() { CheckChanges(); _listImplementation.Clear(); } public bool Contains(T item) { CheckChanges(); return _listImplementation.Contains(item); } public void CopyTo(T[] array, int arrayIndex) { CheckChanges(); _listImplementation.CopyTo(array, arrayIndex); } public bool Remove(T item) { //CheckChanges(); return _listImplementation.Remove(item); } public int Count { get { CheckChanges(); return _listImplementation.Count; } } public bool IsReadOnly { get { CheckChanges(); return _listImplementation.IsReadOnly; } } public int IndexOf(T item) { CheckChanges(); return _listImplementation.IndexOf(item); } public void Insert(int index, T item) { CheckChanges(); _listImplementation.Insert(index, item); } public void RemoveAt(int index) { CheckChanges(); _listImplementation.RemoveAt(index); } public T this[int index] { get { CheckChanges(); return _listImplementation[index]; } set { _listImplementation[index] = value; CheckChanges(); } } private void CheckChanges() { if (!_isDirty) return; _array = new T[_listImplementation.Count]; _listImplementation.CopyTo(_array, 0); _isDirty = false; } } public static partial class Extensions { public static IDictionary CreateOrAddIfEmety(this IDictionary self, TKey key, Func createFactory) { if (self.ContainsKey(key) is false) { self.Add(key, createFactory.Invoke()); } return self; } } }