void Resize(int newSize, bool forceNewHashCodes) { RuntimeAssert.GreaterOrEquals(newSize, _entries.Length, nameof(newSize)); int[] newBuckets = new int[newSize]; for (int i = 0; i < newBuckets.Length; i++) { newBuckets[i] = -1; } Entry[] newEntries = new Entry[newSize]; Array.Copy(_entries, 0, newEntries, 0, _count); if (forceNewHashCodes) { for (int i = 0; i < _count; i++) { if (newEntries[i].HashCode != -1) { newEntries[i].HashCode = GetKeyHasCode(newEntries[i].Key); } } } for (int i = 0; i < _count; i++) { if (newEntries[i].HashCode >= 0) { int bucket = newEntries[i].HashCode % newSize; newEntries[i].Next = newBuckets[bucket]; newBuckets[bucket] = i; } } _buckets = newBuckets; _entries = newEntries; }
/// <summary> /// Copies all assignments to the specified array at the specified index. /// </summary> /// <param name="array">Array.</param> /// <param name="arrayIndex">Array index.</param> public void CopyTo(KeyValuePair <TKey, TValue>[] array, int arrayIndex) { RuntimeAssert.ArgumentNotNull(array, nameof(array)); RuntimeAssert.IndexInRange(arrayIndex, 0, array.Length - 1, nameof(arrayIndex)); RuntimeAssert.GreaterOrEquals(array.Length - arrayIndex, _count, nameof(array)); if (null != _entries) { for (var i = 0; i < _count; ++i) { if (_entries[i].HashCode >= 0) { array[i + arrayIndex] = new KeyValuePair <TKey, TValue>(_entries[i].Key, _entries[i].Value); } } } }