2017-01-31 8 views
0
DataTable users_table = db.GetRows("SELECT * FROM users"); 

int rowCount = users_table.Rows.Count; 
int columnCount = users_table.Columns.Count; 

Dictionary<int, Dictionary<string, string>> baskets = new Dictionary<int, Dictionary<string, string>>(); 

for (int i = 0; i < rowCount; i++) 
{ 
    baskets.Add(i, new Dictionary<string, string>()); 
    for (int j = 0; j < columnCount; j++) 
    { 
     var colName = (users_table.Columns[i].ColumnName).ToString(); 
     var colValue = users_table.Rows[i][j].ToString(); 
     baskets[i].Add(colName, colValue); 
     Response.Write(baskets[i]["user_id"].ToString()); 
    } 
} 

これは私が持っているエラーです。DataTableからaspxで多次元辞書を作成するには?

ArrgumentExceptionは、バスコード[i] .Add(colName、colValue)でユーザコードによって処理されませんでした。

An exception of type 'System.ArgumentException' occurred in mscorlib.dll but was not handled in user code 

Additional information: An item with the same key has already been added. 

私は間違っていますか?私はそれをデバッグし、 "i"、 "colName"と "colValue"の値が正しいです。なぜそれが私にエラーを与えているのか分からない。 私はネットプログラミングで初心者です

+0

'辞書' .NETで冪等 'Add'と' Set'の操作はできません(とは違っのためのトリックを行う可能性があります。この

for (int i = 0; i < rowCount; i++) { for (int j = 0; j < columnCount; j++) { var colName = users_table.Columns[j].ColumnName; var colValue = users_table.Rows[i][j].ToString(); baskets[i].Add(colName, colValue); Response.Write(baskets[i]["user_id"].ToString()); } } 

のようなあなたのコードの何かを作るでしょうC++の 'map'、あるいはPHPとPythonの連想配列)を使って、2つのケースを別々に扱わなければなりません。 – Dai

答えて

1

内部ループでiは変更されないため、colNameの値は変更されません。その結果、あなたはを通して同じキーごとに追加している:あなたはColumns[j]代わりのColumns[i]から名前をつかむためのものほとんどの

var colName = (users_table.Columns[i].ColumnName).ToString(); 
baskets[i].Add(colName, colValue); 

、これが問題「目の第二の対」です。

FWIWの場合は、伝統的な "i"と "j"ではなく、よりわかりやすいカウンタ変数名を使用することで回避できます。質問からあなたのコード「何かがColumns[row]と間違っている」と気づくことが容易である私見に変換します。

for (int row = 0; i < rowCount; row++) 
{ 
    baskets.Add(row, new Dictionary<string, string>()); 
    for (int col = 0; col < columnCount; col++) 
    { 
     var colName = (users_table.Columns[row].ColumnName).ToString(); 
     var colValue = users_table.Rows[row][col].ToString(); 
     baskets[row].Add(colName, colValue); 
     Response.Write(baskets[row]["user_id"].ToString()); 
    } 
} 

サイド注1:上記ToString()への通話が不要であるのでDataTable.ColumnNameは、すでに文字列であります。

注釈2:「user_id」列が列0でない限り、Response.Write行は失敗します。これはおそらく内側のループの外側にあることを意図していたのでしょうか、あるいはデバッグ目的のために追加されただけでしょうか?

サイドノート3:インナーループでインデクサーbaskets[row]を使用する代わりに、内部ディクショナリへの参照を保持することもできます。はい、これはおそらく、マイクロ秒の違いですが、:これは最初の反復で0ですし、それが到達したときに辞書に整数を追加するので

for (int row = 0; i < rowCount; row++) 
{ 
    var colDic = new Dictionary<string, string>(); 
    baskets.Add(row, colDic); 
    for (int col = 0; col < columnCount; col++) 
    { 
     var colName = users_table.Columns[row].ColumnName; 
     var colValue = users_table.Rows[row][col].ToString(); 
     colDic.Add(colName, colValue); 
    } 
} 
0

は、単にライン

baskets.Add(i, new Dictionary<string, string>()); 

を削除しますbaskets[i].Add(colName, colValue);に辞書は既に0をキーに追加しています。同じ項目を再度追加することはできません。だから、その行を削除すると、あなた

+0

KeyNotFoundException –

関連する問題