public RequestCloneCollection(ScorocodeSdkStateHolder stateHolder, string collectionId, string newCollectionName) : base(stateHolder) { //this.collection = new ScorocodeCollection() // .setCollectionId(collectionId) // .setCollectionName(newCollectionName); collection = new CloneCollection(collectionId, newCollectionName); }
public void InsertRange(int index, ReadOnlySpan <T> items) { lock (SyncRoot) { using (var xs = new CloneCollection <T>(items)) { list.InsertRange(index, xs.AsEnumerable()); CollectionChanged?.Invoke(NotifyCollectionChangedEventArgs <T> .Add(xs.Span, index)); } } }
public void AddRange(IEnumerable <T> items) { lock (SyncRoot) { var index = list.Count; using (var xs = new CloneCollection <T>(items)) { // to avoid iterate twice, require copy before insert. list.AddRange(xs.AsEnumerable()); CollectionChanged?.Invoke(NotifyCollectionChangedEventArgs <T> .Add(xs.Span, index)); } } }
public void PushRange(IEnumerable <T> items) { lock (SyncRoot) { using (var xs = new CloneCollection <T>(items)) { foreach (var item in xs.Span) { stack.Push(item); } CollectionChanged?.Invoke(NotifyCollectionChangedEventArgs <T> .Add(xs.Span, 0)); } } }
// AddFirstRange is not exists. public void AddLastRange(IEnumerable <T> items) { lock (SyncRoot) { var index = buffer.Count; using (var xs = new CloneCollection <T>(items)) { foreach (var item in xs.Span) { buffer.AddLast(item); } CollectionChanged?.Invoke(NotifyCollectionChangedEventArgs <T> .Add(xs.Span, index)); } } }
public void RemoveRange(int index, int count) { lock (SyncRoot) { #if NET5_0_OR_GREATER var range = CollectionsMarshal.AsSpan(list).Slice(index, count); #else var range = list.GetRange(index, count); #endif // require copy before remove using (var xs = new CloneCollection <T>(range)) { list.RemoveRange(index, count); CollectionChanged?.Invoke(NotifyCollectionChangedEventArgs <T> .Remove(xs.Span, index)); } } }
// AddFirstRange is not exists. public void AddLastRange(IEnumerable <T> items) { lock (SyncRoot) { using (var xs = new CloneCollection <T>(items)) { if (capacity <= buffer.Count + xs.Span.Length) { // calc remove count var remCount = Math.Min(buffer.Count, buffer.Count + xs.Span.Length - capacity); using (var ys = new ResizableArray <T>(remCount)) { for (int i = 0; i < remCount; i++) { ys.Add(buffer.RemoveFirst()); } CollectionChanged?.Invoke(NotifyCollectionChangedEventArgs <T> .Remove(ys.Span, 0)); } } var index = buffer.Count; var span = xs.Span; if (span.Length > capacity) { span = span.Slice(span.Length - capacity); } foreach (var item in span) { buffer.AddLast(item); } CollectionChanged?.Invoke(NotifyCollectionChangedEventArgs <T> .Add(span, index)); } } }