Как перенести хеш с несколькими ключами из perl в ac # эквивалент? - PullRequest
0 голосов
/ 06 июня 2019

При переносе модуля perl в код на c # я наткнулся на то, как перенести хеш-код с нескольких ключей из perl в эквивалент c #:

$map{$key1}{$key2}=$value;

В коде perl для порта я могу определить несколько строк с одним и тем же ключом1, а также получить доступ к хешу только с помощью первого ключа:

# define multiple lines with the same key1 : ex :
$key1 = '1'; 
$key2 = 'a';
$map{$key1}{$key2}=54;
$key2 = 'b';
$map{$key1}{$key2}=47;

# can access the hash only with the first key : ex :
if (exists($$map{'1'}) {}

Но в c #, если я использую словарь c #, я не могу добавить одинаковые строки key1, он говорит, что дубликаты ключей. Например, в C #, если я делаю это, у меня появляется ошибка:

var map = new Dictionary<string, Dictionary<string, int>>();
map.Add(key1, new Dictionary<string, int>() { { key2, 54 } });
map.Add(key1, new Dictionary<string, int>() { { key2, 47 } });

Точно так же, если я использую кортеж в качестве ключа, я смогу добавить 2 строки с одинаковым ключом 1 (и другим ключом 2), но я не смогу получить доступ к словарю только с первым ключом:

var map = new Dictionary<Tuple<string, string>, int>();
map.Add(new Tuple<string, string>(key1, key2), 54);
map.Add(new Tuple<string, string>(key1, key2), 47);
if (map["1"] != null) {} // => this gives an error

Есть идеи?

1 Ответ

2 голосов
/ 06 июня 2019

В вашем корневом словаре вы должны добавить новую запись, только если она еще не существует. Попробуйте это:

key1 = "1";
key2 = "a";
if(!map.TryGetValue(key1, out var subMap))
{
  map[key1] = subMap = new Dictionary<string, int>();
}
subMap[key2] = 54;

// somewhere else in code
key1 = "1";
key2 = "b";
if(!map.TryGetValue(key1, out var subMap))
{
  map[key1] = subMap = new Dictionary<string, int>();
}
subMap[key2] = 47;
...