/// <summary> /// Merges two lists of ValueChange objects, canceling out any matching Add/Delete pairs and duplicate values /// </summary> /// <param name="attribute">The attribute that the ValueChanges represent</param> /// <param name="sourceList">The original list of ValueChanges</param> /// <param name="newValues">The new list of ValueChanges</param> /// <returns>A new list containing the merged values from both lists</returns> public static IList <ValueChange> MergeValueChangeLists(AcmaSchemaAttribute attribute, IList <ValueChange> sourceList, IList <ValueChange> newValues) { IList <ValueChange> newList = new List <ValueChange>(sourceList); if (newValues.Count == 0) { return(newList); } ValueChangeComparer valueComparer = new ValueChangeComparer(attribute, false); IList <ValueChange> nonDuplicatedNewList = RemoveDuplicateValueChanges(attribute, newValues); foreach (var newChange in nonDuplicatedNewList) { ValueChange changeInSource = sourceList.FirstOrDefault(t => valueComparer.Equals(newChange, t)); if (changeInSource == null) { newList.Add(newChange); } else { if (changeInSource.ModificationType == ValueModificationType.Add) { if (newChange.ModificationType == ValueModificationType.Delete) { Logger.WriteLine("Canceled attribute add due to subsequent delete: {0} - {1}", LogLevel.Debug, attribute.Name, changeInSource.Value.ToSmartStringOrNull()); newList.Remove(changeInSource); } else if (newChange.ModificationType == ValueModificationType.Add) { Logger.WriteLine("Duplicate add detected: {0} - {1}", LogLevel.Debug, attribute.Name, changeInSource.Value.ToSmartStringOrNull()); continue; } } else if (changeInSource.ModificationType == ValueModificationType.Delete) { if (newChange.ModificationType == ValueModificationType.Add) { Logger.WriteLine("Canceled attribute delete due to subsequent add: {0} - {1}", LogLevel.Debug, attribute.Name, changeInSource.Value.ToSmartStringOrNull()); newList.Remove(changeInSource); newList.Add(newChange); } else if (newChange.ModificationType == ValueModificationType.Delete) { Logger.WriteLine("Duplicate delete detected: {0} - {1}", LogLevel.Debug, attribute.Name, changeInSource.Value.ToSmartStringOrNull()); continue; } } } } return(newList); }
public static IList <ValueChange> RemoveDuplicateValueChanges(AcmaSchemaAttribute attribute, IList <ValueChange> changes) { ValueChangeComparer changeComparer = new ValueChangeComparer(attribute, true); return(changes.Distinct(changeComparer).ToList()); }