private void OnAdd(object sender, int index, IEnumerable <TSource> newItems)
        {
            IEnumerable <TSource> addedItems   = GetAddedItems(index, newItems);
            ItemsIndex <TSource>? removedItems = GetRemovedItemsFromAdd(index, newItems.Count());

            if (addedItems != null)
            {
                if (removedItems != null)
                {
                    FireRemove(removedItems.Value.Items, removedItems.Value.Index);
                }
                FireAdd(addedItems, index);
            }
        }
        private void OnRemove(object sender, int index, IEnumerable <TSource> oldItems)
        {
            IEnumerable <TSource> removed = GetRemovedItems(index, oldItems);

            if (removed != null)
            {
                FireRemove(removed, index);
                ItemsIndex <TSource>?addedItems = GetAddedItemsFromRemove(index, oldItems.Count());
                if (addedItems != null)
                {
                    FireAdd(addedItems.Value.Items, addedItems.Value.Index);
                }
            }
        }