2017-09-17 10 views
1

こんにちは私は何かをしようとしますPHPデータベースからデータを取り出し、2次元コレクション(辞書)に格納するもの 私はそれを正しく書いているかどうかわかりません。C# - データベースからデータを取得し、2次元ディクショナリに格納しますか?

のは、私のデータベーステーブルと期待される構造結果が

Click to see screenshot

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:」は、このエラーが発生しました辞書の中に。

どうすればいいですか?

答えて

2

辞書は2次元です。あなたがそれを初期化すると

Dictionary<string, Dictionary<string, string>> test = new Dictionary<string, Dictionary<string, string>>(); 

最初の次元が初期化されますが、第二されていない - すなわちtestは空の辞書です。だから、第2次元の辞書に本のタイトルを追加しようとすると、まだ追加されている辞書はありません。

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; 
} 
+0

偉大な回答サー – Jonesopolis

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; 
} 
関連する問題