2016-11-22 2 views
-2

Im используя DictionaryПолучение KeyNotFoundException при использовании словарь

private Dictionary<int, List<SpawnGroup>> spawnsByMapId 
      = new Dictionary<int, List<SpawnGroup>>(); 

Но я получаю сообщение об ошибке «KeyNotFoundException» при использовании этого кода:

List<SpawnGroup> a = spawnsByMapId[worldId];//KeyNotFoundException 
if (a == null) 
{ 
    // do something with a 
} 

Я хочу сделать словарь spawnsByMapId[worldId] Добавить в List<SpawnGroup>, но если ключа spawnsByMapId[worldId] не существует, то return null в List<SpawnGroup>

Итак, что мне нужно чтобы делать?

+4

Ну это просто не то, что '' Словарь <,> индексатор делает - вы проверить [документацию] (https://msdn.microsoft.com/en -us/библиотека/9tee9ht2 (v = vs.110) .aspx)? Вместо этого используйте 'TryGetValue'. –

+0

Эй, ты решил это плохо. Кроме того, вам не нужно обновлять вопрос, как вы его решили - вот для чего нужны ответы! – Jamiec

+0

@Jamiec спасибо за предложение xD –

ответ

4

Либо с помощью ContainsKey с тройной оператор:

List<SpawnGroup> a = spawnByMapId.ContainsKey(worldId) ? spawnsByMapId[worldId] : null; 
if(a != null) 
{ 
    // a is not null here. 
} 

или TryGetValue:

List<SpawnGroup> a = null; 
if(spawnsByMapId.TryGetValue(worldId, out a)) 
{ 
    // a is not null here. 
} 

Это звучит (с комментариями), как вы пытаетесь сделать это:

List<SpawnGroup> a = null; 
if(!spawnsByMapId.TryGetValue(worldId, out a)) 
{ 
    // add new record to spawnsByMapId 
    spawnsByMapId.Add(worldId, new List<SpawnGroup>()); 
} 
+0

Спасибо, что его работа как шарм xD –

+0

Я предпочитаю '.TryGetValue()', потому что он делает только один поиск вместо двух. – Oliver

+0

@Oliver полностью согласен, но поставил оба для полноты. – Jamiec

0

My стандартный рисунок, если вы хотите использовать вложенные словари это один:

List<SpawnGroup> groups; 

if(!dict.TryGetValue(myId, out groups)) 
{ 
    groups = new List<SpawnGroup>(); 
    dict.Add(myId, groups); 
} 

// further proceed with groups