首页 > 解决方案 > 加速 DataTable 迭代

问题描述

所以我有一个DataTable data需要替换一些列的内容。

string[] columns = { "Column1", "Column2", "Column3" };
int rowCount = data.Rows.Count;
int colCount = columns.Length;
for (int i = 0; i < rowCount; i++)
{
    for (int j = 0; j < columnsCount; j++)
    {
        data.Rows[i][columns[j]] = "replace text";
    }
}

该代码完成了它的工作,但由于 DataTable 有更多记录,它的速度很慢。12k 行大约需要 4 分钟。

我怎样才能加快这个过程?

标签: c#.net

解决方案


因此,对于 100 万行和 3 列,每个单元格上的查找和替换大约需要 2 秒(在我的 PC 上)。我猜您对响应每个更改的数据绑定有问题,或者由于某种原因您的替换操作非常慢。

    Stopwatch sw = new Stopwatch();

    DataTable dt = new DataTable();
    dt.Columns.Add("Column1");
    dt.Columns.Add("Column2");
    dt.Columns.Add("Column3");

    Random r = new Random();
    sw.Start();
    for (int i = 0; i < 1_000_000; i++)
    {
        dt.Rows.Add(dt.NewRow());
        for (int j = 0; j < 3; j++)
            dt.Rows[i][j] = r.Next().ToString();
    }

    Console.WriteLine("Row Count:" + dt.Rows.Count);
    Console.WriteLine("Rows with the digit 0:" + dt.Rows.Cast<DataRow>().Count(row=>((string)row[0]).Contains('0')));

    sw.Stop();
    Console.WriteLine("Time taken to fill table:" + sw.Elapsed);

    sw.Reset();
    sw.Start();
    for( int i = 0 ; i < 1_000_000 ; i++)
        for (int j = 0; j < 3; j++)
            dt.Rows[i][j] = ((string) dt.Rows[i][j]).Replace('0', '1');

    sw.Stop();
    Console.WriteLine("Row Count:" + dt.Rows.Count);
    Console.WriteLine("Rows with the digit 0:" + dt.Rows.Cast<DataRow>().Count(row=>((string)row[0]).Contains('0')));
    Console.WriteLine("Time taken to update table:" + sw.Elapsed);

    Console.ReadLine();

推荐阅读