internal static void MergeBindings(MultiValuedProperty <BindingMetadata> bindings, MultiValuedProperty <BindingMetadata> addedBindings, MultiValuedProperty <BindingMetadata> removedBindings, bool forceClear) { ArgumentValidator.ThrowIfNull("bindings", bindings); ArgumentValidator.ThrowIfNull("addedBindings", addedBindings); ArgumentValidator.ThrowIfNull("removedBindings", removedBindings); if (forceClear && bindings.Any <BindingMetadata>()) { bindings.Clear(); return; } using (MultiValuedProperty <BindingMetadata> .Enumerator enumerator = removedBindings.GetEnumerator()) { while (enumerator.MoveNext()) { BindingMetadata item = enumerator.Current; BindingMetadata bindingMetadata = bindings.FirstOrDefault((BindingMetadata p) => p.ImmutableIdentity == item.ImmutableIdentity); if (bindingMetadata != null) { bindings.Remove(bindingMetadata); } } } using (MultiValuedProperty <BindingMetadata> .Enumerator enumerator2 = addedBindings.GetEnumerator()) { while (enumerator2.MoveNext()) { BindingMetadata item = enumerator2.Current; BindingMetadata bindingMetadata2 = bindings.FirstOrDefault((BindingMetadata p) => p.ImmutableIdentity == item.ImmutableIdentity); if (bindingMetadata2 == null) { bindings.Add(item); } else if (!string.Equals(bindingMetadata2.DisplayName, item.DisplayName, StringComparison.InvariantCulture) || !string.Equals(bindingMetadata2.Name, item.Name, StringComparison.InvariantCultureIgnoreCase)) { int index = bindings.IndexOf(bindingMetadata2); bindings[index] = item; } } } }