2017-01-31 4 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이 baskets [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"값이 올바른지. 왜 그것이 내게 오류가되는지 모르겠다. 나는 .net 프로그래밍에서 초보자입니다

+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의 연상 배열). 그래서 두 경우를 다르게 처리해야합니다. – Dai

답변

1

내부 루프에서 i은 변경되지 않으므로 colName의 값은 변경되지 않습니다. 결과적으로 당신은을 통해 동일한 키마다 추가하는 : 당신이 Columns[j] 대신 Columns[i]에서 이름을 잡기 위해 의미 대부분의 경우

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

와이 문제는 "눈의 두 번째 쌍"입니다.

FWIW를 사용하면 "전통적"인 ij 대신 설명이 가능한 카운터 변수 이름을 사용하여 피할 수 있습니다.

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()에 전화 위의 불필요, 이미 문자열입니다 질문에서 코드는 이럴는 "뭔가 Columns[row] 잘못"으로 통지하는 것이 더 쉽습니다 인에 번역 .

사이드 노트 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>()); 

을 제거 사전에 0이 (가) baskets[i].Add(colName, colValue);에 추가되어 동일한 항목을 다시 추가 할 수 없습니다. 그래서 라인을 제거하면

+0

KeyNotFoundException –

관련 문제