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

时间:2014-07-30 13:50:12

标签: c# performance datatable

我想知道你是否有人知道手动填写DataTable的更快方法。

这是我得到的,我有一个大约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];
}

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

非常感谢任何输入!

3 个答案:

答案 0 :(得分:4)

为什么先创建一个空行,然后再次循环表以填充它们?

我会使用简单的foreach

var table_list = new DataTable();
table_list.Columns.Add();
foreach(string[] fields in lists)
{
    DataRow newRow = table_list.Rows.Add();
    newRow.SetField(0, string.Join("", fields));
}

为什么要将所有字段放入一个字段?

答案 1 :(得分:4)

  

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

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

class Foo {
    public string ColumnName {get;set;}
}

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

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

现在通过FastMember在该懒惰序列之上创建一个IDataReader

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);
}

这比填充DataTable要好得多 - 特别是,它避免填充巨大的DataTable。重点:以上是假脱机 - 没有缓冲。

答案 2 :(得分:1)

为什么不使用LoadDataRow的{​​{1}}方法。

DataTable

另请参阅: DataTable.LoadDataRow方法 http://msdn.microsoft.com/en-us/library/kcy03ww2(v=vs.110).aspx