Скажем, мой словарь должен иметь ключ с помощью комбинации ItemId и RegionId, оба int. И скажем, что тип стороны значения - «Данные». Я мог бы сделать это двумя способами:
Способ 1: многоуровневый словарь, например:
Dictionary<int, Dictionary<int, Data>> myData;
, чтобы поиск можно было закодировать следующим образом:
Data data1 = myData[itemId][regionId];
Неплохо, но недостаток в том, что мне нужно проверьте наличие ключа на первом уровне, поэтому более безопасным кодом будет
Data data1 = null;
if (myData.ContainsKey(itemId)) data1 = myData[itemId][regionId];
Способ 2: используйте ключ, состоящий из нескольких частей. В этом подходе я бы создал структуру для представления частей и использовал бы структуру в качестве ключа словаря:
private struct MultiPartKey
{
public int ItemId;
public int RegionId;
}
Dictionary<MultiPartKey, Data> myData;
, и поиск был бы таким:
MultiPartKey mpk;
mpk.ItemId = itemId;
mpk.RegionId = regionId;
Data data1 = myData[mpk];
Возможным недостатком здесь является то, что он работает только в том случае, если моя структура состоит полностью простых типов значений, так что побитовое сравнение двух экземпляров будет равным. (Верно?)
Как вы думаете?