Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么';将数据表转换为对象[,]的最有效方法是什么?_C#_Linq_C# 4.0_Datatable - Fatal编程技术网

C# 什么';将数据表转换为对象[,]的最有效方法是什么?

C# 什么';将数据表转换为对象[,]的最有效方法是什么?,c#,linq,c#-4.0,datatable,C#,Linq,C# 4.0,Datatable,我有一堆DataTables,需要转换成object[,]数组(不是object[][]数组)。在性能方面,最有效的方法是什么 我知道我可以通过最初构建对象[dt.Rows.Count,dt.Columns.Count]来做到这一点,然后通过行循环并将每一行解析到数组中的一个位置,但我相当肯定还有其他方法,例如使用Linq或System.Data特定功能,例如dataRow.ToItemArray(),可能更有效 MyDataTables的大小可变,除了字符串外,还包含需要适当格式化的日期和数字

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

我知道我可以通过最初构建
对象[dt.Rows.Count,dt.Columns.Count]
来做到这一点,然后通过行循环并将每一行解析到数组中的一个位置,但我相当肯定还有其他方法,例如使用Linq或System.Data特定功能,例如
dataRow.ToItemArray()
,可能更有效

My
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 基本上,我们需要:

  • 对象[,]分配内存

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

  • 然后,我们需要将对象从行项复制到多维数组中。在处理对象时,无法在此使用
    缓冲区.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;
    }
    
    公共静态对象[,]转换(数据表dt)
    {
    var行=dt行;
    int rowCount=rows.Count;
    int colCount=dt.Columns.Count;
    var result=新对象[rowCount,colCount];
    对于(int i=0;i
    使用LINQ并不能神奇地加快速度。通过“更高效”,你是想提高算法的时间复杂度(比如O(n^2)到O(n)),还是仅仅是一个常数因子的改进?为什么不在帖子中包含“之前”和“之后”数据?@SteveWellens当然,它被添加为“转换为对象[,]”“同时包含需要适当格式化的日期和数字”这很让人困惑,如果你有一个对象数组,你就得不到格式化。你想把所有东西都转换成格式化的字符串,然后再转换成对象吗?我想你会手工编写这些东西。
    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;
    }