2016-07-29 2 views
0

Я получил здесь исключение, которое не находит ключ rootPartNo в словаре unbreakableLinkMap.KeyNotFoundException в C#

MyTree<IDbRecord> currentTree = PartHelper.GetTreeForRootId(succesorId, graph); 
#region TreeSheet 
string rootPartNo = currentTree.Root.Payload.GetField(Part.c_partNo).GetString(); 

//get spirit links 
var spiritLinks = graph.unbreakableLinkMap[rootPartNo]; 
Worksheet treeWS = excel.Worksheets[2]; 
treeWS.Name = "Tree"; 
long displayedPartId = long.Parse(GetIdFromSession(Part.t_name)); 
int rowNo = 0; 
bool bold = false; 
Color color = Color.Black; 
foreach (MyTreeNode<IDbRecord> node in currentTree.Root.DepthFirstNodeEnumerator) 
{ 
    string partNo = node.Payload.GetField(Part.c_partNo).GetString(); 
    treeWS.Cells[rowNo, node.Depth].PutValue(partNo); 
    bold = false; 
    color = Color.Black; 
    if (spiritLinks.Find(suc => suc.PartNo == partNo || suc.SucPartNo == partNo) != null) 
    { 
     color = Color.Red; 
    } 
    if (node.Payload.GetField(Part.c_id).GetInt64() == displayedPartId) 
    { 
     bold = true; 
    } 

    headerFStyle.Font.IsBold = bold; 
    headerFStyle.Font.Color = color; 
    treeWS.Cells[rowNo, node.Depth].SetStyle(headerFStyle); 
    rowNo++; 
} 

Как я могу проверить/подтвердить это?

+4

ли вы использовать отладчик? – MickyD

+0

Да. Это не очень много говорит о том, что словарь не имеет значений. – Nomonom

+0

Проверьте/подтвердите, что? Если словарь говорит, что ключа там нет, это не так. Вам не нужно проверять/проверять это. Вероятно, происходит то, что либо ключ находится в другом случае (словарь по умолчанию «чувствителен к регистру»). Вы также можете использовать методы 'Contains()' или 'TryGet()', чтобы избежать исключения и сначала проверить, находится ли в нем значение. – RobIII

ответ

3

Обычно вы получаете это исключение, когда ключ, указанный для доступа к элементу в коллекции, не соответствует любому ключу в коллекции.

Я хотел бы предложить использовать отладчик и посмотреть, что у вас есть Key доступны в Dictionary

Если вы не уверены в существовании ключа, я предложил бы писать оборонительный код, используя ContainsKey или TryGetValue.

if (graph.unbreakableLinkMap.ContainsKey(key)) 
{ 
    ... 
} 

или

if((graph.unbreakableLinkMap.TryGetValue(key, out spiritLinks) {} 
2

Ну, вам нужно отлаживать. Поставьте точку останова на линии

var spiritLinks = graph.unbreakableLinkMap[rootPartNo]; 

, запустить процедуру и проверять значение вопроса:

rootPartNo 

, а также ключи словаря

graph.unbreakableLinkMap.Keys 

Если вы не можете использовать отладчик по какой-либо причине добавить отладочный результат

... 
    string rootPartNo = currentTree.Root.Payload.GetField(Part.c_partNo).GetString(); 

    // Debug output: when key is not found, show additional info 
    if (!graph.unbreakableLinkMap.ContainsKey[rootPartNo]) 
    MessageBox.Show(String.Format(
     "Key to find is \"{0}\" and keys in the dictionary are\r\n{1}", 
     rootPartNo, 
     String.Join(", ", graph.unbreakableLinkMap.Keys))); 

    ... 
Смежные вопросы