你好
DataTable是否适合批量十万行的大规模数据处理?
我有一个场景,原型如下,可以有效地满足两个需求,如if-else所示。
场景:
有一个数据表。有一个相同数量的一维列表/数组。 DataTable的特定列中保存的值将替换为列表中相应的位置值。如果找到空值,则这些位置值需要即时计算,从而将{key,value}对的新列表停放在一旁。
事实证明,逐行扫描DataTable非常缓慢。 DataTable是否适合此类目的?如果是,是否有更有效的方式来实现相同的目标?如果没有,请您告诉我哪些替代的.net编程功能可以解决问题,谢谢。
DataTable是否适合批量十万行的大规模数据处理?
我有一个场景,原型如下,可以有效地满足两个需求,如if-else所示。
场景:
有一个数据表。有一个相同数量的一维列表/数组。 DataTable的特定列中保存的值将替换为列表中相应的位置值。如果找到空值,则这些位置值需要即时计算,从而将{key,value}对的新列表停放在一旁。
事实证明,逐行扫描DataTable非常缓慢。 DataTable是否适合此类目的?如果是,是否有更有效的方式来实现相同的目标?如果没有,请您告诉我哪些替代的.net编程功能可以解决问题,谢谢。
C#:
using System;
using System.Data;
using System.Collections.Generic;
namespace UpdateDataTable
{
class Program
{
static void Main(string[] args)
{
DataTable table = GetTable();
string[] CarNames = { "Volvo", "Tesla", null, null, "Ford" };
DataTable returnedTable = UpdateTable(table, CarNames);
for (int i = 0; i < returnedTable.Rows.Count; i++)
{
DataRow row = table.Rows[i];
Console.WriteLine(row["Car"]);
}
}
static DataTable GetTable()
{
DataTable table = new DataTable();
table.Columns.Add("ID", typeof(int));
table.Columns.Add("Car", typeof(string));
table.Columns.Add("Name", typeof(string));
table.Columns.Add("Date", typeof(DateTime));
table.Rows.Add(25, "Car A", "A", DateTime.Now);
table.Rows.Add(50, "Car B", "B", DateTime.Now);
table.Rows.Add(10, "Car C", "C", DateTime.Now);
table.Rows.Add(21, "Car D", "D", DateTime.Now);
table.Rows.Add(100, "Car E", "E", DateTime.Now);
return table;
}
static DataTable UpdateTable(DataTable table, string[] CarNames)
{
var list = new 清单<KeyValuePair<int, string>>();
for (int i=0; i < table.Rows.Count; i ++)
{
DataRow row = table.Rows[i];
if ( !string.IsNullOrEmpty (CarNames[i] ) )
{
row["Car"] = CarNames[i]; // Requirement-1 : to update datatable with non-nulls
}
else
{
row["Car"] = "hello"; //Requirement-2: Construct new value and pile them up in a list of pairs
list.Add(new KeyValuePair<int, string>(i, "hello"));
}
} // DataTable is updated row-by-row and is found very slow for large volumes
return table;
} // end of UpdateTable
} // end of class
}