void OnSourceCollectionChanged(IReadOnlyCollection <TSource> removedItems, IReadOnlyCollection <TSource> addedItems) { List <TResult> removedResults = new List <TResult>(); foreach (TSource removedSource in removedItems) { for (int i = 0; i < inputCollections.Count; i++) { var inputCollection = inputCollections[i]; if (EqualityComparer <TSource> .Default.Equals(inputCollection.source, removedSource)) { inputCollection.AddResultsToList(removedResults); inputCollection.UnregisterEvent(); inputCollections.RemoveAt(i); break; } } } List <TResult> addedResults = new List <TResult>(); foreach (TSource addedSource in addedItems) { var inputCollection = new InputCollection(this, addedSource); inputCollection.AddResultsToList(addedResults); inputCollection.RegisterEvent(); inputCollections.Add(inputCollection); } OnCollectionChanged(removedResults, addedResults); }