2016-07-29 51 views
0

我收到一個異常,在unbreakableLinkMap字典中沒有找到rootPartNo的密鑰。c中的KeyNotFoundException#

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

如果您不能確定鍵的存在,我建議寫防守代碼,用ContainsKeyTryGetValue

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))); 

    ... 
相關問題