高性能的方式来改变数据内容

本文关键字:数据 改变 方式 高性能 | 更新日期: 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);
    }
}