2017-01-31 33 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. 

我做錯了什麼?我調試它,「我」,「colName」和「colValue」的值是正確的。不知道爲什麼它給了我錯誤。 我是新手在.net編程

+0

'字典'在.NET不允許冪等'Add'和'Set'操作(不像C++的'map',或PHP和Python中的關聯數組),所以你必須以不同的方式處理這兩種情況。 – Dai

回答

1

在你的內部循環i不會改變,因此colName的值不會改變。其結果是你通過添加相同的鍵每次:

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

最有可能你的意思是從Columns[j]而不是Columns[i]搶名字,這是一個「第二對眼睛」的問題。

FWIW,您可以通過使用更多描述性計數器變量名稱而不是「傳統」ij來避免此問題。從這個問題你的代碼轉換爲,這恕我直言,是更容易注意到的「什麼是錯與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:DataTable.ColumnName已經是一個字符串,所以你上面的給ToString()調用是不必要的。

備註2:除非「user_id」列爲0列,否則Response.Write行將失敗。這可能是爲了在內部循環之外,或者爲了調試目的而添加?

備註3:您也可以保留對內部字典的引用,而不是每次在內部循環中使用索引器baskets[row]。是的,這可能是微妙的差異,但:

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

因爲這會增加是0在第一次迭代,然後當它到達詞典整數到baskets[i].Add(colName, colValue);字典已在該密鑰中添加0,並且不能再次添加相同的項目。因此,移除該行會做使你的代碼是這樣的

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()); 
    } 
} 

可能做的伎倆爲您

+0

KeyNotFoundException –