2012-06-13 60 views
4

我需要遍歷字典C#通過列表<詞典<字符串,字符串>>循環來填充一個DataTable

List<Dictionary<string,string>> 

的列表來填充的DataTable。列表中的每個字典都有一個Key,它必須是列名稱,而Value則是該列中的內容。該列表包含225個字典(225行到表)。

List<Dictionary<string, string>> myList = 
     JsonConvert.DeserializeObject<List<Dictionary<string, string>>>(jsonRep); 
DataTable dt = new DataTable(); 

    //loop through list, loop through dictionaries, add keys as columns, 
    //values as rows.      

到目前爲止,我一直在努力..

//get max columns 
int columns = myList[0].Count; <--gives me 13 
//add columns 
for (int i = 0; i < columns; i++) 
    dt.Columns.Add(string myList[i].Keys); <--somehow get to the key in dict to add as column names   
//add rows 
foreach (var x in myList) 
{ 
    dt.Rows.Add(x); <--not working 
} 
jsonReprValue = dt; <--save new DataTable to var jsonReprValue 

如何做到這一點是否正確? 謝謝!

+0

是列的每一行的一樣嗎? –

回答

7

你有兩個問題。一個是添加列,另一個是添加行。

添加列

假設你的列表中有項目在裏面,並且在列表中的所有詞典按鍵相同,那麼你只需要在其中的一個詞典添加列:

foreach(string column in myList[0].Keys) 
{ 
    dt.Columns.Add(column); 
} 

添加行

更改此:

foreach (var x in myList) 
{ 
    dt.Rows.Add(x); <--not working 
} 

要這樣:

foreach(Dictionary<string, string> dictionary in myList) 
{ 
    DataRow dataRow = dt.NewRow(); 

    foreach(string column in dictionary.Keys) 
    { 
     dataRow[column] = dictionary[column]; 
    } 

    dt.Rows.Add(dataRow); 
} 

DataTable.NewRow

+0

感謝您的快速回復!是的,每列的列都是一樣的。每個字典包含相同的密鑰,但不同的值。所以,我根本不需要完成第一部分.get max columns,add columns等?當我評論說全部出來並且只是有這個foreach循環時,當它到達dtrow [column] = dict [column]時,我得到一個錯誤。說'列'日期不屬於表格。日期是第一個鍵(列名)。 –

+0

我更新了我的答案,以解決「獲取列」問題。 –

+0

謝謝!工作很棒! –

0

Reiview DataTable類的示例如何使用數據表。但這裏是使用LINQ

List<Dictionary<string, string>> myList = new List<Dictionary<string, string>>() 
                 { new Dictionary<string,string>() { { "ABC", "This" }, 
                          { "DEF", "is" }, 
                          { "GHI", "radio" }, 
                          { "JKL", "clash" } } }; 

DataTable dt = new DataTable(); 

// Add columns first 
dt.Columns.AddRange(myList.First() 
          .Select (kvp => new DataColumn() { ColumnName = kvp.Key, DataType = System.Type.GetType("System.String")}) 
          .AsEnumerable() 
          .ToArray() 
          ); 

// Now add the rows 
myList.SelectMany (Dict => Dict.Select (kvp => new { 
                Row = dt.NewRow(), 
                Kvp = kvp 
                })) 
     .ToList() 
     .ForEach(rowItem => { 
           rowItem.Row[rowItem.Kvp.Key] = rowItem.Kvp.Value; 
           dt.Rows.Add(rowItem.Row); 
          } 
      ); 
dt.Dump(); 

的結果的一個例子(轉儲LinqPad具體不淨): enter image description here

相關問題