// Needed for NET40 #if !NET_4_6 using System; using System.Collections.Generic; using LinqInternal.Collections.ThreadSafe; using LinqInternal.Core; namespace LinqInternal.Collections.Specialized { [System.Diagnostics.DebuggerNonUserCode] internal partial class DelegatedCollection : ICollection { private readonly IReadOnlyCollection _readOnly; private readonly Func> _wrapped; public DelegatedCollection(Func> wrapped) { if (wrapped == null) { throw new ArgumentNullException("wrapped"); } _wrapped = wrapped; _readOnly = new ExtendedReadOnlyCollection(this); } public IReadOnlyCollection AsReadOnly { get { return _readOnly; } } public int Count { get { return Instance.Count; } } public bool IsReadOnly { get { return Instance.IsReadOnly; } } private ICollection Instance { get { return _wrapped.Invoke() ?? ArrayReservoir.EmptyArray; } } public void Add(T item) { Instance.Add(item); } public void Clear() { Instance.Clear(); } public bool Contains(T item) { return Instance.Contains(item); } public bool Contains(T item, IEqualityComparer comparer) { return System.Linq.Enumerable.Contains(Instance, item, comparer); } public void CopyTo(T[] array, int arrayIndex) { Instance.CopyTo(array, arrayIndex); } public void CopyTo(T[] array) { Instance.CopyTo(array, 0); } public void CopyTo(T[] array, int arrayIndex, int countLimit) { Extensions.CanCopyTo(array, arrayIndex, countLimit); Instance.CopyTo(array, arrayIndex, countLimit); } public IEnumerator GetEnumerator() { var collection = Instance; foreach (var item in collection) { if (!ReferenceEquals(collection, Instance)) { throw new InvalidOperationException(); } yield return item; } } public bool Remove(T item) { return Instance.Remove(item); } public bool Remove(T item, IEqualityComparer comparer) { if (comparer == null) { comparer = EqualityComparer.Default; } foreach (var foundItem in Instance.RemoveWhereEnumerable(input => comparer.Equals(input, item))) { GC.KeepAlive(foundItem); return true; } return false; } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return GetEnumerator(); } public T[] ToArray() { var array = new T[Instance.Count]; Instance.CopyTo(array, 0); return array; } } } #endif