2016-07-29 15 views
0

rootPartNoのキーがunbreakableLinkMapの辞書に見つかりません。ここに例外があります。KeyNotFoundException in 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

通常、コレクション内の要素にアクセスするために指定されたキーがでない場合、はコレクション内の任意のキーと一致します。

私が使用して、デバッガを提案し、あなたがキーの存在がわからない場合Dictionary

で利用可能Keyすると、私はContainsKeyまたはTryGetValueを使用して、守備のコードを書くことを示唆していることを持って見るであろう。

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

または

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

まあ、デバッグする必要があります。

rootPartNo 

だけでなく、辞書のキー

graph.unbreakableLinkMap.Keys 

をデバッガを使用できない場合は、次のルーチンを実行して、質問の値を検査し、

var spiritLinks = graph.unbreakableLinkMap[rootPartNo]; 

行にブレークポイントを置きます何らかの理由でデバッグ出力を追加する

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

    ...