Skip to content
This repository has been archived by the owner on Jan 23, 2023. It is now read-only.

Commit

Permalink
CoreFx #15622 Dictionary<TKey, TValue>.Remove(TKey, out TValue) (#10203)
Browse files Browse the repository at this point in the history
  • Loading branch information
WinCPP authored and danmoseley committed Apr 11, 2017
1 parent df20d56 commit 5748039
Showing 1 changed file with 48 additions and 0 deletions.
48 changes: 48 additions & 0 deletions src/mscorlib/src/System/Collections/Generic/Dictionary.cs
Original file line number Diff line number Diff line change
Expand Up @@ -584,6 +584,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)
Expand Down Expand Up @@ -622,6 +625,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);
Expand Down

0 comments on commit 5748039

Please sign in to comment.