你好我尝试做一些像 PHP 这样的东西,它是从数据库中检索数据并存储在二维集合(Dictionary)中 我不确定我是否写得正确。
假设我的数据库表和预期的结构结果如下所示(参见屏幕截图)
public ActionResult ShowBook()
{
var books = from v in db.Books
select v;
Dictionary<string, Dictionary<string, string>> test = new Dictionary<string, Dictionary<string, string>>();
foreach (var item in books)
{
test[item.Book_Type_ID][item.Author_ID] = item.Book_Name;
}
return .....
}
但我有这个错误
System.Collections.Generic.KeyNotFoundException:
'字典中没有给定的密钥。'
我该怎么办?
答案 0 :(得分:2)
字典是二维的。初始化时
Dictionary<string, Dictionary<string, string>> test = new Dictionary<string, Dictionary<string, string>>();
初始化第一维,但不是第二维 - 即test
是空字典。因此,当您尝试将书名添加到第二维词典时,还没有要添加到其中的词典。您需要首先检查此条件,并创建一个条目(如果该条目尚不存在):
var books = from v in db.Books select v;
Dictionary<string, Dictionary<string, string>> test = new Dictionary<string, Dictionary<string, string>>();
foreach (var item in books)
{
if (!test.ContainsKey(item.Book_Type_ID))
test[item.Book_Type_ID] = new Dictionary<string, string>();
test[item.Book_Type_ID][item.Author_ID] = item.Book_Name;
}
答案 1 :(得分:2)
问题是,在为外部字典分配新密钥时,必须初始化每个内部Dictionary<string, string>
。通常,这意味着检查此密钥是否存在,如果不存在,则创建对象:
foreach (var item in books)
{
if(!test.ContainsKey(item.Book_Type_ID))
{
test[item.Book_Type_ID] = new Dictionary<string, string>();
}
//now we are sure it exists, add it
test[item.Book_Type_ID][item.Author_ID] = item.Book_Name;
}