From b618f509ad2770ca16f3739842081c5fe161e0b7 Mon Sep 17 00:00:00 2001 From: neuecc Date: Thu, 26 Aug 2021 20:13:42 +0900 Subject: [PATCH] v --- .../ObservableRingBuffer.Views.cs | 61 +++++++++---------- .../ObservableRingBuffer.cs | 19 ++++++ 2 files changed, 49 insertions(+), 31 deletions(-) diff --git a/src/ObservableCollections/ObservableRingBuffer.Views.cs b/src/ObservableCollections/ObservableRingBuffer.Views.cs index 9811569..77b7481 100644 --- a/src/ObservableCollections/ObservableRingBuffer.Views.cs +++ b/src/ObservableCollections/ObservableRingBuffer.Views.cs @@ -155,43 +155,40 @@ namespace ObservableCollections } break; case NotifyCollectionChangedAction.Remove: - if (e.IsSingleItem) + // starting from 0 is RemoveFirst + if (e.OldStartingIndex == 0) { - var v = ringBuffer[e.OldStartingIndex]; - ringBuffer.RemoveAt(e.OldStartingIndex); - filter.InvokeOnRemove(v.Item1, v.Item2); + // RemoveFirst + if (e.IsSingleItem) + { + var v = ringBuffer.RemoveFirst(); + filter.InvokeOnRemove(v); + } + else + { + for (int i = 0; i < e.OldItems.Length; i++) + { + var v = ringBuffer.RemoveFirst(); + filter.InvokeOnRemove(v); + } + } } else { - var len = e.OldStartingIndex + e.OldItems.Length; - for (int i = e.OldStartingIndex; i < len; i++) + // RemoveLast + if (e.IsSingleItem) { - var v = ringBuffer[i]; - filter.InvokeOnRemove(v.Item1, v.Item2); + var v = ringBuffer.RemoveLast(); + filter.InvokeOnRemove(v); + } + else + { + for (int i = 0; i < e.OldItems.Length; i++) + { + var v = ringBuffer.RemoveLast(); + filter.InvokeOnRemove(v); + } } - - ringBuffer.RemoveRange(e.OldStartingIndex, e.OldItems.Length); - } - break; - case NotifyCollectionChangedAction.Replace: - // ObservableList does not support replace range - { - var v = (e.NewItem, selector(e.NewItem)); - - var oldItem = ringBuffer[e.NewStartingIndex]; - ringBuffer[e.NewStartingIndex] = v; - - filter.InvokeOnRemove(oldItem); - filter.InvokeOnAdd(v); - break; - } - case NotifyCollectionChangedAction.Move: - { - var removeItem = ringBuffer[e.OldStartingIndex]; - ringBuffer.RemoveAt(e.OldStartingIndex); - ringBuffer.Insert(e.NewStartingIndex, removeItem); - - filter.InvokeOnMove(removeItem); } break; case NotifyCollectionChangedAction.Reset: @@ -204,6 +201,8 @@ namespace ObservableCollections } ringBuffer.Clear(); break; + case NotifyCollectionChangedAction.Replace: + case NotifyCollectionChangedAction.Move: default: break; } diff --git a/src/ObservableCollections/ObservableRingBuffer.cs b/src/ObservableCollections/ObservableRingBuffer.cs index 13eea04..78997af 100644 --- a/src/ObservableCollections/ObservableRingBuffer.cs +++ b/src/ObservableCollections/ObservableRingBuffer.cs @@ -160,8 +160,27 @@ namespace ObservableCollections CollectionChanged?.Invoke(NotifyCollectionChangedEventArgs.Add(value, buffer.Count - 1)); } } + } + public void AddLastRange(T[] values) + { + lock (SyncRoot) + { + if (buffer.Count + values.Length -1 == fixedSize) + { + for (int i = 0; i < values.Length; i++) + { + buffer.RemoveFirst(); // removes... + } + for (int i = 0; i < values.Length; i++) + { + buffer.AddLast(values[i]); + } + // Remove... + } + + } } } }