高性能的方式来改变数据内容
本文关键字:数据 改变 方式 高性能 | 更新日期: 2023-09-27 18:09:27
我有一个5000行以上的数据表。
对于某些列,我必须更改值。(123;#Name -> Name)
我尝试了好几种方法,但都很慢。
明显的变体每行大约需要1秒来更改值。在我所能的范围内,所有这些都被用来赋值。
foreach (DataRow row in table.Rows)
{
foreach (var column in replaceColumns)
{
row[column] = userRegex.Replace(row[column].ToString(), "$1");
}
}
我尝试创建一个新表,其中只有一列和更改的值,并合并两个表。创建新表非常快。合并两个表的方式会变慢。
DataTable dt = new DataTable();
DataColumn dc = new DataColumn("Test2");
dc.DataType = typeof(string);
dt.Columns.Add(dc);
foreach (DataRow row in table.Rows)
{
dt.Rows.Add(row["Test"]);
}
所以我尝试创建整个新表,因为单列表是如此之快。好吧,它也没起作用。它以一个可接受的速度开始,但是随着插入的行越来越多,它变得越来越慢。
var t = table.Clone();
foreach (DataRow row in table.Rows)
{
var nr = t.NewRow();
foreach (DataColumn dc in table.Columns)
{
if (replaceColumns.Contains(dc.ColumnName))
{
nr[dc.ColumnName] = userRegex.Replace(row[dc.ColumnName].ToString(), "$1");
}
else
{
nr[dc.ColumnName] = row[dc.ColumnName];
}
}
t.Rows.Add(nr);
}
有人知道如何显著提高性能吗?
不确定这是否会显著提高性能,但您可以尝试一下。您不需要根据每行的每一列的列名列表检查列名。相反,您可以在循环之前执行:
DataColumn[] replaceColumns = table.Columns.Cast<DataColumn>()
.Where(c => new[] { "Column1", "Column2" }.Contains(c.ColumnName))
.ToArray();
foreach (DataRow row in table.Rows)
{
foreach (DataColumn col in replaceColumns)
{
string newStr = userRegex.Replace(row.Field<string>(col), "$1");
row.SetField(col, newStr);
}
}