public static IDisposable ProcessEach <T>(this IObservableCollection <T> self, Action <T> func, Action <T> onRemove = null) { foreach (var item in self) { func(item); } var finalDisp = new ListDisposable(); var collection = new Collection <T>(); finalDisp.Add(self.ObserveReset().Listen(unit => { if (onRemove != null) { foreach (var element in collection) { onRemove(element); } } collection.Clear(); })); finalDisp.Add(self.ObserveAdd().Listen(add => { func(add.Value); collection.Add(add.Value); })); finalDisp.Add(self.ObserveReplace().Listen(replaceEvent => { collection.Add(replaceEvent.NewValue); collection.Remove(replaceEvent.OldValue); func(replaceEvent.NewValue); if (onRemove != null) { onRemove(replaceEvent.OldValue); } })); if (onRemove != null) { finalDisp.Add(self.ObserveRemove().Listen(remove => { onRemove(remove.Value); collection.Remove(remove.Value); })); } return(finalDisp); }