From f9ca2763d04ed9e267414b1103ce93927af8185e Mon Sep 17 00:00:00 2001 From: WinCPP Date: Wed, 12 Apr 2017 00:18:36 +0530 Subject: [PATCH] CoreFx #15622 Dictionary.Remove(TKey, out TValue) --- .../System/Collections/Generic/Dictionary.cs | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/src/mscorlib/src/System/Collections/Generic/Dictionary.cs b/src/mscorlib/src/System/Collections/Generic/Dictionary.cs index a379e9458b8e..8f335e762531 100644 --- a/src/mscorlib/src/System/Collections/Generic/Dictionary.cs +++ b/src/mscorlib/src/System/Collections/Generic/Dictionary.cs @@ -590,6 +590,9 @@ private void Resize(int newSize, bool forceNewHashCodes) entries = newEntries; } + // The overload Remove(TKey key, out TValue value) is a copy of this method with one additional + // statement to copy the value for entry being removed into the output parameter. + // Code has been intentionally duplicated for performance reasons. public bool Remove(TKey key) { if (key == null) @@ -628,6 +631,51 @@ public bool Remove(TKey key) return false; } + // This overload is a copy of the overload Remove(TKey key) with one additional + // statement to copy the value for entry being removed into the output parameter. + // Code has been intentionally duplicated for performance reasons. + public bool Remove(TKey key, out TValue value) + { + if (key == null) + { + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.key); + } + + if (buckets != null) + { + int hashCode = comparer.GetHashCode(key) & 0x7FFFFFFF; + int bucket = hashCode % buckets.Length; + int last = -1; + for (int i = buckets[bucket]; i >= 0; last = i, i = entries[i].next) + { + if (entries[i].hashCode == hashCode && comparer.Equals(entries[i].key, key)) + { + if (last < 0) + { + buckets[bucket] = entries[i].next; + } + else + { + entries[last].next = entries[i].next; + } + + value = entries[i].value; + + entries[i].hashCode = -1; + entries[i].next = freeList; + entries[i].key = default(TKey); + entries[i].value = default(TValue); + freeList = i; + freeCount++; + version++; + return true; + } + } + } + value = default(TValue); + return false; + } + public bool TryGetValue(TKey key, out TValue value) { int i = FindEntry(key);