在c#中手动填充DataTable的最快方法
本文关键字:方法 DataTable 填充 | 更新日期: 2023-09-27 18:15:32
我想知道如果有人知道一个更快的方式来填写一个手动数据表,然后我做。
这是我得到的,我有一个大约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和填充方法的问题),我决定张贴我的问题。
任何输入是高度赞赏!
我添加这个数据表到一个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
。强调:以上是假脱机 -没有缓冲
为什么先创建一个空行,然后再次循环该表来填充它们?
我会使用简单的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));
}
你为什么把所有的东西放在一个字段里?
为什么不使用DataTable
的LoadDataRow
方法
// turnoff notifications
table_list.BeginLoadData();
// load each row into the table
foreach(string[] fields in lists)
table_list.LoadDataRow(new object[] { string.Join("", fields) }, false);
// turn notifications back on
table_list.EndLoadData();
参见:DataTable。LoadDataRow方法 http://msdn.microsoft.com/en-us/library/kcy03ww2(v=vs.110).aspx