private void RemoveItems(IEnumerable <T> itemsToRemove, ObservedCollection <T> observedCollection)
 {
     foreach (var item in itemsToRemove)
     {
         RemovePrivate(item, observedCollection);
     }
 }
 private void AddItems(IEnumerable <T> items, ObservedCollection <T> observedCollection)
 {
     if (observedCollection.AddFilter == null)
     {
         foreach (T item in items)
         {
             AddPrivate(item, observedCollection);
         }
     }
 }
        /// <summary>
        /// Decrements an item's reference count and if it's reached zero, removes it from the main collection.
        /// </summary>
        private void RemovePrivate(T item, ObservedCollection <T> observedCollection)
        {
            var observedItem = _observedItems.FirstOrDefault(i => i.Item == item);

            if (observedItem != null)
            {
                observedItem.Sources.Remove(observedCollection);
                if (observedItem.Sources.Count > 0)
                {
                    return;
                }
            }
            Remove(item);
        }
        /// <summary>
        /// Adds an item to the merged collection and increments its reference count.
        /// </summary>
        private void AddPrivate(T item, ObservedCollection <T> observedCollection)
        {
            if (!Contains(item))
            {
                Add(item);
            }
            var observedItem = _observedItems.FirstOrDefault(i => i.Item == item);

            if (observedItem == null)
            {
                observedItem = new ObservedItem <T>(item);
                _observedItems.Add(observedItem);
            }
            observedItem.Sources.Add(observedCollection);
        }
        /// <summary>
        /// Registers an ObservableCollection and adds all filtered members to the MergedObservableCollection.
        /// </summary>
        /// <param name="collection">The collection to observe for additions and deletions.</param>
        public void RegisterObservedCollection(INotifyCollectionChanged collection)
        {
            var observedCollection = _observedCollections.FirstOrDefault(oc => oc.ObservableCollection == collection);

            if (observedCollection == null)
            {
                observedCollection = new ObservedCollection <T>
                {
                    ObservableCollection = collection
                };
                _observedCollections.Add(observedCollection);
                collection.CollectionChanged += observedCollection_CollectionChanged;
                var items = collection as IEnumerable;
                if (items != null)
                {
                    AddItems(items.Cast <T>(), observedCollection);
                }
            }
        }