Alex Rivera | Logout

Best approach to multi-part int dictionary key?

Asked 2011-02-11T21:58:47.447
10

Say my dictionary needs to be keyed by a combination of ItemId and RegionId, both int. And say the type of the value side is "Data". I could do this a couple of ways:

Way 1: multi-level dictionary, like this:

Dictionary<int, Dictionary<int, Data>>  myData;

so a lookup could be coded like this:

Data data1  = myData[itemId][regionId];

Not bad, but a drawback is that I would need to check for key existence at the first level, so safer code would be

Data data1 = null;
if (myData.ContainsKey(itemId)) data1 =  myData[itemId][regionId];

Way 2: use a multi-part key. In this approach I would create a struct to represent the parts, and use a struct as the dictionary key:

private struct MultiPartKey
{
    public int ItemId;
    public int RegionId;
}

Dictionary<MultiPartKey, Data>  myData;

and a lookup would be like:

MultiPartKey mpk;
mpk.ItemId = itemId;
mpk.RegionId = regionId;
Data data1 = myData[mpk];

A possible disadvantage here is that it only works if my struct is composed entirely of simple value types, so that a bitwise comparison of two instances will be equal. (Right?)

What do you think?

Edit
Report

1 Answer

11

Yet another way would be to use the Tuple class:

Dictionary<Tuple<int, int>, Data>  myData;

This works with up to eight values, provided they implement Equals and GetHashCode.

answered 2011-02-11T22:07:27.860

Your Answer