/// <summary> /// See the <see cref="IImmutableDictionary{TKey, TValue}"/> interface. /// </summary> public ImmutableDictionary <TKey, TValue> WithComparers(IEqualityComparer <TKey>?keyComparer, IEqualityComparer <TValue>?valueComparer) { if (keyComparer == null) { keyComparer = EqualityComparer <TKey> .Default; } if (valueComparer == null) { valueComparer = EqualityComparer <TValue> .Default; } if (this.KeyComparer == keyComparer) { if (this.ValueComparer == valueComparer) { return(this); } else { // When the key comparer is the same but the value comparer is different, we don't need a whole new tree // because the structure of the tree does not depend on the value comparer. // We just need a new root node to store the new value comparer. var comparers = _comparers.WithValueComparer(valueComparer); return(new ImmutableDictionary <TKey, TValue>(_root, comparers, _count)); } } else { var comparers = Comparers.Get(keyComparer, valueComparer); var set = new ImmutableDictionary <TKey, TValue>(comparers); set = set.AddRange(this, avoidToHashMap: true); return(set); } }
/// <summary> /// Initializes a new instance of the <see cref="ImmutableDictionary{TKey, TValue}"/> class. /// </summary> /// <param name="comparers">The comparers.</param> private ImmutableDictionary(Comparers?comparers = null) { _comparers = comparers ?? Comparers.Get(EqualityComparer <TKey> .Default, EqualityComparer <TValue> .Default); _root = SortedInt32KeyNode <HashBucket> .EmptyNode; }
/// <summary> /// Initializes a new instance of the <see cref="ImmutableDictionary<TKey, TValue>"/> class. /// </summary> /// <param name="comparers">The comparers.</param> private ImmutableDictionary(Comparers comparers = null) { this.comparers = comparers ?? Comparers.Get(EqualityComparer <TKey> .Default, EqualityComparer <TValue> .Default); this.root = ImmutableSortedDictionary <int, HashBucket> .Node.EmptyNode; }