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()
,可能更有效
MyDataTables
的大小可变,除了字符串外,还包含需要适当格式化的日期和数字
例如,如果我的一个数据表包含
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;
}