Coverting List of Dictionary to DataTable
.net, c#, casting, datatable
Solution
The answers above don't address the issue of the dictionary having more than 1 row. This solution addresses the issue.
static DataTable ToDataTable(List<Dictionary<string, int>> list)
{
DataTable result = new DataTable();
if (list.Count == 0)
return result;
var columnNames = list.SelectMany(dict=>dict.Keys).Distinct();
result.Columns.AddRange(columnNames.Select(c=>new DataColumn(c)).ToArray());
foreach (Dictionary<string,int> item in list)
{
var row = result.NewRow();
foreach (var key in item.Keys)
{
row[key] = item[key];
}
result.Rows.Add(row);
}
return result;
}
static void Main(string[] args)
{
List<Dictionary<string, int>> it = new List<Dictionary<string, int>>();
Dictionary<string, int> dict = new Dictionary<string, int>();
dict.Add("a", 1);
dict.Add("b", 2);
dict.Add("c", 3);
it.Add(dict);
dict = new Dictionary<string, int>();
dict.Add("bob", 34);
dict.Add("tom", 37);
it.Add(dict);
dict = new Dictionary<string, int>();
dict.Add("Yip Yip", 8);
dict.Add("Yap Yap", 9);
it.Add(dict);
DataTable table = ToDictionary(it);
foreach (DataColumn col in table.Columns)
Console.Write("{0}\t", col.ColumnName);
Console.WriteLine();
foreach (DataRow row in table.Rows)
{
foreach (DataColumn column in table.Columns)
Console.Write("{0}\t", row[column].ToString());
Console.WriteLine();
}
Console.ReadLine();
}
And the output looks like...
a b c bob tom Yip Yip Yap Yap
1 2 3
34 37
8 9
Problem
Currently we are doing this by looping through each value of list and dictionary: ``` private DataTable ChangeToDictionary(List<Dictionary<string,int>> list) { DataTable datatTableReturn = new DataTable(); if (list.Count() > 0) { Dictionary<string, int> haeders = list.ElementAt(0); foreach (var colHead in haeders) { datatTableReturn.Columns.Add(colHead.Key); } } foreach (var row in list) { DataRow dataRow = datatTableReturn.NewRow(); foreach (var col in row) { dataRow[col.Key] = col.Value; } datatTableReturn.Rows.Add(dataRow); } return datatTableReturn; } ``` But is there a better way? Looping through so many times doesn't feel good