使用C#循环遍历List<Dictionary<string, string>>以填充DataTable

4
我需要循环遍历一个字典列表。
List<Dictionary<string,string>> 

用于填充DataTable。列表中的每个字典都有一个键,需要作为列名,并且有一个值,即该列中的内容。列表包含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

如何正确地进行这个操作呢?谢谢!


每一行的列都相同吗? - Steven Doggart
2个回答

8
你有两个问题。一个是添加列,另一个是添加行。
添加列
假设你的列表中有项目,并且所有字典都有相同的键,则只需要从其中一个字典中添加列即可:
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

谢谢您的快速回复!是的,每一行的列都是相同的。每个字典包含相同的键,但不同的值。所以,我根本不需要做第一部分...获取最大列数,添加列等?当我注释掉所有这些并只有这个foreach循环时,当它到达dtrow[column] = dict[column]时,我会收到一个错误,说“列'Date'不属于表”。Date是第一个键(列名)。 - Tonia Roddick
我更新了我的答案以回答“获取列”的问题。 - Seth Flowers

0

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

结果(Dump是LinqPad特定的,而不是.Net): enter image description here

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接