在 C# 中手动填充 DataTable 的最快方法

use*_*224 2 c# datatable performance

我想知道你们中是否有人知道手动填充数据表的更快方法,然后我知道。

这是我得到的,我有一个大约有 1.7b 个条目的列表。我想用一列尽快将这些条目填充到 DataTable 中。我列表中的一个条目在这里看起来像这样{"A2C","DDF","ER","SQ","8G"}

我的代码需要大约 7-8 秒

for (int i = 0; i <= lists.Count; i++)
{
    table_list.Rows.Add();
}

for (int a = 0; a < list.Count; a++)
{
    table_list.Rows[a][0] = list[a][0] + list[a][1] + 
        list[a][2] + list[a][3] + list[a][4];
}
Run Code Online (Sandbox Code Playgroud)

由于我没有在板上找到任何类似的问题(只是关于如何通过 sql 和填充方法填充数据表的问题),我决定发布我的问题。

任何输入都受到高度赞赏!

Mar*_*ell 5

我将此 DataTable 添加到 sql server 数据库中(我通过 SqlBulkCopy 执行此操作)

这是个错误; 该DataTable是纯粹的开销在这里。您应该公开的是IDataReader该数据。这个 API 有点棘手,但FastMember使它更容易。例如,听起来您有 1 列;所以考虑:

class Foo {
    public string ColumnName {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

现在编写一个迭代器块方法,将其从每个项目的原始列表转换:

IEnumerable<Foo> Convert(List<TheOldType> list) {
    foreach(var row in list) {
        yield return new Foo { ColumnName = /* TODO */ };
    }
}
Run Code Online (Sandbox Code Playgroud)

现在IDataReader在该惰性序列之上创建一个via FastMember:

List<TheOldType> list
var data = Convert(list);
using(var bcp = new SqlBulkCopy(connection))
using(var reader = ObjectReader.Create(data, "ColumnName"))
{
    bcp.DestinationTableName = "SomeTable";
    bcp.WriteToServer(reader);
}
Run Code Online (Sandbox Code Playgroud)

这比填充 a 更有效DataTable- 特别是,它避免填充巨大的DataTable. 重点:以上是假脱机- 没有缓冲。