Exemplo n.º 1
0
        /// <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);
        }
Exemplo n.º 2
0
        public static IList <ValueChange> RemoveDuplicateValueChanges(AcmaSchemaAttribute attribute, IList <ValueChange> changes)
        {
            ValueChangeComparer changeComparer = new ValueChangeComparer(attribute, true);

            return(changes.Distinct(changeComparer).ToList());
        }