private static MutationResult SymmetricExcept(IEnumerable <T> other, MutationInput origin) { Requires.NotNull(other, "other"); var otherAsSet = Empty.Union(other); int count = 0; var result = SortedInt32KeyNode <HashBucket> .EmptyNode; foreach (T item in new NodeEnumerable(origin.Root)) { if (!otherAsSet.Contains(item)) { var mutationResult = Add(item, new MutationInput(result, origin.EqualityComparer, count)); result = mutationResult.Root; count += mutationResult.Count; } } foreach (T item in otherAsSet) { if (!Contains(item, origin)) { var mutationResult = Add(item, new MutationInput(result, origin.EqualityComparer, count)); result = mutationResult.Root; count += mutationResult.Count; } } return(new MutationResult(result, count, CountType.FinalValue)); }
/// <summary> /// See the <see cref="IImmutableSet{T}"/> interface. /// </summary> public ImmutableHashSet <T> WithComparer(IEqualityComparer <T>?equalityComparer) { equalityComparer ??= EqualityComparer <T> .Default; if (equalityComparer == _equalityComparer) { return(this); } else { var result = new ImmutableHashSet <T>(equalityComparer); result = result.Union(this, avoidWithComparer: true); Debug.Assert(result != null); return(result); } }
public ImmutableHashSet <T> WithComparer(IEqualityComparer <T> equalityComparer) { Contract.Ensures(Contract.Result <ImmutableHashSet <T> >() != null); if (equalityComparer == null) { equalityComparer = EqualityComparer <T> .Default; } if (equalityComparer == this.equalityComparer) { return(this); } else { var result = new ImmutableHashSet <T>(equalityComparer); result = result.Union(this, avoidWithComparer: true); return(result); } }
/// <summary> /// Modifies the current set so that it contains all elements that are present in both the current set and in the specified collection. /// </summary> /// <param name="other">The collection to compare to the current set.</param> public void UnionWith(IEnumerable <T> other) { var result = ImmutableHashSet <T> .Union(other, this.Origin); this.Apply(result); }