我想知道你是否有人知道手动填写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方法填充数据表的问题),我决定发布我的问题。
非常感谢任何输入!
答案 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