public override void UnionWith(IEnumerable <E> other) { foreach (E v in other) { if (null == v) { throw new ArgumentNullException(); } } if (this.IsManaged) { var txn = Transaction.Current; txn.VerifyRecordAccessed(this); var oldv = txn.GetLog(LogKey) is LogV log ? log.Value : set; var newv = oldv.Union(other); if (newv != oldv) { txn.PutLog(NewLog(newv)); ChangeNoteSet <E> note = (ChangeNoteSet <E>)txn.GetOrAddChangeNote(this.ObjectId, () => new ChangeNoteSet <E>(this)); foreach (var item in other) { if (false == oldv.Contains(item)) { note.LogAdd(item); } } } } else { set = set.Union(other); } }
public override void SymmetricExceptWith(IEnumerable <E> other) { if (this.IsManaged) { var txn = Transaction.Current; txn.VerifyRecordAccessed(this); var oldv = txn.GetLog(LogKey) is LogV log ? log.Value : set; var newv = oldv.SymmetricExcept(other); if (newv != oldv) { txn.PutLog(NewLog(newv)); ChangeNoteSet <E> note = (ChangeNoteSet <E>)txn.GetOrAddChangeNote(this.ObjectId, () => new ChangeNoteSet <E>(this)); // this: 1,2 other: 2,3 result: 1,3 foreach (var item in other) { if (oldv.Contains(item)) { note.LogRemove(item); } else { note.LogAdd(item); } } } } else { set = set.SymmetricExcept(other); } }