C#通过列表<词典<字符串,字符串>>循环来填充一个DataTable
我需要遍历字典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
如何做到这一点是否正确? 谢谢!
你有两个问题。一个是添加列,另一个是添加行。
添加列
假设你的列表中有项目在里面,并且在列表中的所有词典按键相同,那么你只需要在其中的一个词典添加列:
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);
}
感谢您的快速回复!是的,每列的列都是一样的。每个字典包含相同的密钥,但不同的值。所以,我根本不需要完成第一部分.get max columns,add columns等?当我评论说全部出来并且只是有这个foreach循环时,当它到达dtrow [column] = dict [column]时,我得到一个错误。说'列'日期不属于表格。日期是第一个键(列名)。 –
我更新了我的答案,以解决“获取列”问题。 –
谢谢!工作很棒! –
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具体不净):
是列的每一行的一样吗? –