是否可以从动态数据表构建对象?

时间:2011-03-17 19:21:52

标签: c# datatable

我有一个动态生成的数据表,所以我不知道它包含的列数。我想构建一个IEnumerable对象,其中包含每行中每个字段的列名和值。

我不想将DataRow对象用作类型。

有办法做到这一点吗?

2 个答案:

答案 0 :(得分:3)

它已经是可枚举的,为什么在它已经存在的时候尝试使它可枚举:

// Results = DataSet
foreach (DataTable table in results.Tables)
{
    Console.WriteLine("Table: " + table.TableName);
    foreach (DataRow row in table.Rows)
    {
        Console.WriteLine("  Row");
        foreach (DataColumn column in table.Columns)
        {
            Console.WriteLine("    " + column.ColumnName + ": " +
                row[column]);
        }
    }
}

答案 1 :(得分:3)

因为我真的不明白你想要完成什么;或者更确切地说,你的目标是什么,我做了一个有趣的小练习。我使用了扩展方法;但是可能有办法改进它......

public static class DataTableExtension
{
    public static IEnumerable<IEnumerable<KeyValuePair<string, object>>> Items(this DataTable table)
    {
        var columns = table.Columns.Cast<DataColumn>().Select(c => c.ColumnName);
        foreach (DataRow row in table.Rows)
        {
            yield return columns.Select(c => new KeyValuePair<string, object>(c, row[c]));

        }
    }
}

static void Main(string[] args)
    {
        DataTable table = new DataTable();
        table.Columns.Add("Last Name");
        table.Columns.Add("First Name");
        table.Rows.Add("Tim", "Taylor");
        table.Rows.Add("John", "Adams");
        foreach (var row in table.Items())
        {
            foreach (var col in row)
            {
                Console.WriteLine("{0}, {1}\t", col.Key, col.Value);
            }

            Console.WriteLine();
        }

        Console.ReadLine();
    }

输出看起来像这样......

Last Name, Tim
First Name, Taylor

Last Name, John
First Name, Adams