示例#1
0
        public void Remove(T obj)
        {
            int id = GetId(obj);

            if (id > 0)
            {
                RemovedIds.Add(id);
            }
            else
            {
                NewObjects.Remove(obj);
            }
        }
示例#2
0
        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();
        }
示例#3
0
        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();
        }
示例#4
0
        /// <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);
        }
示例#5
0
 public IEnumerable <T> GetAll()
 {
     return(IdMap.GetAll()
            .Concat(NewObjects)
            .Where(x => !RemovedIds.Contains(GetId(x))));
 }