c# - 将字典列表转换为数据表

标签 c# .net casting datatable

目前我们通过遍历列表和字典的每个值来做到这一点:

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;

       }

但是有没有更好的办法呢?循环了这么多次感觉不太好

最佳答案

上面的答案没有解决字典多于 1 行的问题。此解决方案解决了这个问题。

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

}

输出看起来像...

a       b       c       bob     tom     Yip Yip Yap Yap
1       2       3
                        34      37
                                        8       9

关于c# - 将字典列表转换为数据表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15293653/

相关文章:

C# 数组最大值

.net - 我想学习 ASP.Net 2.0/3.5/4.0 我应该从 ASP.Net 2.0 开始,然后涵盖其余部分吗?

c++ - 将 char 数组结构 vector 转换为 POD vector ?

C# 无法转义正则表达式字符串中的引号

c# - 在页面的控件集合上使用 LINQ to Objects 时遇到问题

c# - C#中.ToString和 "as string"的区别

c# - 为什么在访问新数组的元素时得到 "object reference not set to instance of object"?

c# - 如何在屏幕分辨率更改时显示完整的窗口 C#

java - 转换实例/引用?

c++ - 作为参数传递给函数模板时如何隐式转换类模板对象?