This commit is contained in:
neuecc 2021-08-26 20:13:42 +09:00
parent f94156f564
commit b618f509ad
2 changed files with 49 additions and 31 deletions

View File

@ -155,43 +155,40 @@ namespace ObservableCollections
}
break;
case NotifyCollectionChangedAction.Remove:
// starting from 0 is RemoveFirst
if (e.OldStartingIndex == 0)
{
// RemoveFirst
if (e.IsSingleItem)
{
var v = ringBuffer[e.OldStartingIndex];
ringBuffer.RemoveAt(e.OldStartingIndex);
filter.InvokeOnRemove(v.Item1, v.Item2);
var v = ringBuffer.RemoveFirst();
filter.InvokeOnRemove(v);
}
else
{
var len = e.OldStartingIndex + e.OldItems.Length;
for (int i = e.OldStartingIndex; i < len; i++)
for (int i = 0; i < e.OldItems.Length; i++)
{
var v = ringBuffer[i];
filter.InvokeOnRemove(v.Item1, v.Item2);
var v = ringBuffer.RemoveFirst();
filter.InvokeOnRemove(v);
}
ringBuffer.RemoveRange(e.OldStartingIndex, e.OldItems.Length);
}
break;
case NotifyCollectionChangedAction.Replace:
// ObservableList does not support replace range
}
else
{
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:
// RemoveLast
if (e.IsSingleItem)
{
var removeItem = ringBuffer[e.OldStartingIndex];
ringBuffer.RemoveAt(e.OldStartingIndex);
ringBuffer.Insert(e.NewStartingIndex, removeItem);
filter.InvokeOnMove(removeItem);
var v = ringBuffer.RemoveLast();
filter.InvokeOnRemove(v);
}
else
{
for (int i = 0; i < e.OldItems.Length; i++)
{
var v = ringBuffer.RemoveLast();
filter.InvokeOnRemove(v);
}
}
}
break;
case NotifyCollectionChangedAction.Reset:
@ -204,6 +201,8 @@ namespace ObservableCollections
}
ringBuffer.Clear();
break;
case NotifyCollectionChangedAction.Replace:
case NotifyCollectionChangedAction.Move:
default:
break;
}

View File

@ -160,8 +160,27 @@ namespace ObservableCollections
CollectionChanged?.Invoke(NotifyCollectionChangedEventArgs<T>.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...
}
}
}
}
}