public void Remove(T obj) { int id = GetId(obj); if (id > 0) { RemovedIds.Add(id); } else { NewObjects.Remove(obj); } }
public void Save() { foreach (T newObj in NewObjects) { Storage.Add(newObj); } foreach (T deletedObj in RemovedIds.Select(id => this.Find(id))) { Storage.Remove(deletedObj); } Storage.Save(); }
public ChangeSet(ValueChange <TParentToken> parentToken, ValueChange <IEnumerable <TChildToken> > childTokens) { OldIds = Ids(childTokens.OldValue).ToArray(); NewIds = Ids(childTokens.NewValue).ToArray(); RemovedIds = Ids(ExceptIds(childTokens.OldValue, NewIds)).ToArray(); AddedIds = Ids(ExceptIds(childTokens.NewValue, OldIds)).ToArray(); PersistentIds = NewIds.Intersect(OldIds).ToArray(); var persistedOld = IntersectIds(childTokens.OldValue, PersistentIds).OrderBy(t => t.Id); var persistedNew = IntersectIds(childTokens.NewValue, PersistentIds).OrderBy(t => t.Id); var persistedPairs = persistedOld.Zip(persistedNew, ValueChange.Create); Diffs = persistedPairs.Where(vc => vc.IsChanged()).ToArray(); AddedChanges = AddedIds.Select(id => Change.Added(parentToken.NewValue.Id, id)).ToArray(); RemovedChanges = RemovedIds.Select(id => Change.Removed(parentToken.NewValue.Id, id)).ToArray(); }
/// <summary> /// Merges a <see cref="ModelValueChangeEvent"/> into the current event. /// </summary> /// <param name="e"></param> /// <returns></returns> protected override bool OnMerge(ModelEvent e) { // Ensure the events are for the same reference property var listChange = (ModelListChangeEvent)e; if (listChange.Property != Property) { return(false); } // Highly likely not to be right var mergeAdded = Added.ToList(); mergeAdded.RemoveAll(i => listChange.Removed.Contains(i)); var mergeRemoved = Removed.ToList(); mergeRemoved.RemoveAll(i => listChange.Added.Contains(i)); mergeAdded = mergeAdded.Union(listChange.Added.Where(i => !Removed.Contains(i))).ToList(); mergeRemoved = mergeRemoved.Union(listChange.Removed.Where(i => !Added.Contains(i))).ToList(); Added = mergeAdded.ToArray(); Removed = mergeRemoved.ToArray(); var mergeAddedIds = AddedIds.ToList(); mergeAddedIds.RemoveAll(i => listChange.RemovedIds.Contains(i)); var mergeRemovedIds = RemovedIds.ToList(); mergeRemovedIds.RemoveAll(i => listChange.AddedIds.Contains(i)); mergeAddedIds = mergeAddedIds.Union(listChange.AddedIds.Where(i => !RemovedIds.Contains(i))).ToList(); mergeRemovedIds = mergeRemovedIds.Union(listChange.RemovedIds.Where(i => !AddedIds.Contains(i))).ToList(); AddedIds = mergeAddedIds.ToArray(); RemovedIds = mergeRemovedIds.ToArray(); return(true); }
public IEnumerable <T> GetAll() { return(IdMap.GetAll() .Concat(NewObjects) .Where(x => !RemovedIds.Contains(GetId(x)))); }