什么是将DataTable转换为对象的最有效方法[,]?

Rac*_*hel 6 c# linq datatable c#-4.0

我有一堆DataTables需要转换为object[,]数组(而不是 object[][]数组).在性能方面,最有效的方法是什么?

我知道我可以通过我的建设做这个object[dt.Rows.Count, dt.Columns.Count]最初,然后通过行循环和解析每一行到阵列中的地方,但我相当肯定还有其他方法,如使用LINQ或System.Data特定的功能,如dataRow.ToItemArray()它可更有效率.

DataTables是可变大小,除了字符串之外,还包含需要格式化的日期和数字.

例如,如果包含我的一个数据表

Id    Name    Date                 Value
1     Rachel  1/1/2013 00:00:00    100.0000
2     Joseph  3/31/2012 00:00:00   50.0000
3     Sarah   2/28/2013 00:00:00   75.5000

那么我想要一个object[,]包含完全相同数据的数组(理想情况下是标题),但是需要格式化的日期和值

arr[x,0] = row[x].Field<int>("Id");
arr[x,1] = row[x].Field<string>("Name");
arr[x,2] = row[x].Field<DateTime>("Date").ToString("M/d/yy");
arr[x,3] = row[x].Field<decimal>("Value").ToString("C2"); // Currency format
Run Code Online (Sandbox Code Playgroud)

Lan*_*kin 8

基本上我们需要:

  1. 为...分配内存 object[,]

    我们在这里做不了多少..我们需要确保一次分配内存而不是再次重新分配.所以很明显我们需要一次创建数组,而不需要使用List.Add(...)内部重新分配内存块的操作.

  2. 然后,我们需要将对象从行项复制到多维数组中.我们Buffer.BlockCopy在处理对象时无法使用.当然,我们不能依赖任何memcpy类似的行为,因为每个对象的CLR需要复制其引用,或者对值类型执行unbox-> copy in heap-> box.所以,最简单的方法就是... ..风格.

所以,看起来这里的大多数性能解决方案都是直观的:

public static object[,] Convert(DataTable dt)
{
    var rows = dt.Rows;
    int rowCount = rows.Count;
    int colCount = dt.Columns.Count;
    var result = new object[rowCount, colCount];

    for (int i = 0; i < rowCount; i++)
    {
        var row = rows[i];
        for (int j = 0; j < colCount; j++)
        {
            result[i, j] = row[j];
        }
    }

    return result;
}
Run Code Online (Sandbox Code Playgroud)