Getting a KeyValuePair<> directly from a Dictionary<>

Viewed 64266

I have System.Collections.Generic.Dictionary<A, B> dict where A and B are classes, and an instance A a (where dict.ContainsKey(a) is true).

Is it possible to get the KeyValuePair containing a directly from the Dictionary?
Or do I need to create a new KeyValuePair: new KeyValuePair<A, B>(a, dict[a])?

5 Answers

The accepted answer probably is not going to be too helpful for some common scenarios. Keep in mind that the key is a class. So, in order to access the value object for that key, a key object must already exist. So, what if you have an older key object and the dictionary contains newer information in that key object (but still using the same key fields within that key object)? Or, another quite plausible scenario is what if only the fields used as the key are available and a temporary key object is then created that incorporates those key fields?

The accepted answer uses an extension method to return a KeyValuePair that contains the old key, not the actual key object within the dictionary. As such, it is not going to work for these common cases.

So, Supercat's idea of using a KeyValuePair for the value that includes the key is the only approach that will work in O(1) time. The drawback is that this approach is not only more complex, but it also requires an extra 8 bytes (for a 64-bit OS) for each entry in the dictionary, which is usually not a concern. Looks like Microsoft missed the boat on this one, because they really should provide a method that returns the key in a dictionary.

Here is an example of how to create a dictionary with a KeyValuePair as the value:

    var dict = new Dictionary<a, KeyValuePair<a, b>>();

Then to access it:

    var kvp = dict[key]; // key is of type a.
    a itemKey = kvp.key;
    b itemVal = kvp.value;

So, code like this will work if you have control over the dictionary definition. If you are using 3rd party software, or it is too much trouble to change, then you have to iterate over the entire collection - which is an O(n) operation.

Related