访问我的访问者时字典错误“KeyNotFound”

时间:2014-12-16 02:11:17

标签: c# dictionary

我正在

'System.Collections.Generic.KeyNotFoundException' occurred in mscorlib.dll

当我运行我的代码时,everthing似乎很好,我一直无法找到错误。这是我的班级路径我的获取/设置

   foreach (Tran transaction in transactions)
        {
            Account sAcc = items[transaction.ID1];//getting error here
            Account dAcc = items[transaction.ID2];
            decimal tempResult = sAcc.Money - transaction.Amount;
            foreach (char s in sAcc.BorP)
                Console.WriteLine(s);

这是我的get / set class

 public class Tran
{
    public int ID1 { get; set; }
    public int ID2 { get; set; }
    public decimal Amount { get; set; }
}

它之前运行,我运行了一些测试,我不断收到此错误,不知道是什么原因导致int。谢谢你的帮助

2 个答案:

答案 0 :(得分:0)

您可以使用字典的TryGetValue方法。

以下是使用

的示例代码
object result; // Un-Initialized instance result
myCollection.TryGetValue("Test", out result); // If the key exists the method will out the value

从另一个SO帖子中抓取。

来自MSDN的Dictionary.TryGetValue方法条目:

  

此方法结合了ContainsKey方法的功能   Item属性。

     

如果未找到密钥,则value参数将获得相应的参数   值类型TValue的默认值;例如,0(零)表示   整数类型,布尔类型为false,引用类型为null。

     

如果您的代码经常尝试访问,请使用TryGetValue方法   不在字典中的键。使用这种方法更多   比捕获Item抛出的KeyNotFoundException更有效   属性。

     

此方法接近O(1)操作。

此帖子中还引用了Indexer vs TryGetValue

的效果

What is more efficient: Dictionary TryGetValue or ContainsKey+Item?

答案 1 :(得分:-2)

您遇到的问题是您尝试从items数组中读取的项目不存在。

使用

if (items.ContainsKey(transaction.ID1) && items.ContainsKey(transaction.ID2))
{
  // Your code.
} else {
  // Signal an error.
}

或者,如果您在事务不存在时要使用默认帐户类,则可以使用此类内容。

if (!items.TryGetValue(transaction.ID1, out sAcc))
  items.Add(transaction.ID1, sAcc = new Account);
if (!items.TryGetValue(transaction.ID2, out dAcc))
  items.Add(transaction.ID2, dAcc = new Account);
// Your code.

否则,如果事务ID:s应始终在项目中,则代码的问题可能超出了您在此处共享的代码段。我会检查ID:你正在试图查找并进行健全性检查。