繁体   English   中英

从C#的数据表中筛选100k行的值大约需要15分钟

[英]Filtering a value from Data Table in C# for 100k rows interatively is taking around 15 minutes

在下面的代码中,我使用了2种方法(其中1条已注释)。

protected DataRow[] GetRows(DataTable dataTable, string keyColumn, object KeyValue)
{
    DataRow[] rows = null;

    /*dataTable.DefaultView.RowFilter = "[" + keyColumn + "] Like '%" + keyValue.ToString() + "%'";
    dataTable = dataTable.DefaultView.ToTable();
    rows = dataTable.Select();*/

    rows = dataTable.Select("[" + keyColumn + "] Like '%" + keyValue.ToString() + "%'");

    return rows;
}

有没有更快的方法来完成相同的任务? 该方法GetRows被调用了大约一千次。 dataTable有100 000行。

实际的BusinessLogic看起来像

        public void BusinessLogic()
        {

            foreach (DataRow dRow in dataTableOne.Rows)
            {

                var primaryKey = dRow["PrimaryColumn"];

                DataRow[] rows;
                    rows = GetRows(dataTableTwo,"PrimaryColumn" , primaryKey);

        /*
            Business Logic
        */

        }
        }

尝试为我使用Linq ,它的速度提高了10倍:

protected static DataRow[] GetRows(DataTable dataTable, string keyColumn, string keyValue)
{
    return dataTable.Rows
        .OfType<DataRow>()
        .Where(row => SafeContains(row[keyColumn], keyValue, StringComparison.OrdinalIgnoreCase))
        .ToArray();
}

private static bool SafeContains(object source, string value, StringComparison stringComparison)
{
    var s = source as string;
    if (string.IsNullOrEmpty(s))
        return false;
    return s.IndexOf(value, stringComparison) >= 0;
}

尚未测试过,我不确定内存的含义,但是如果是导致缓慢的like命令,那么如果您通过遍历第一个DataTable并存储1000个中的每个主键来避免它,该怎么办?记录并创建一个单独的DataTable

var primaryKeys = new string[dataTableOne.Rows.Count];
var dataTables = new DataTable[dataTableOne.Rows.Count] ;

for (int i= 0 ; i < dataTableOne.Rows.Count ; i++)
{
    dataTables[i] = new DataTable();
    primaryKeys[i] = (string) dataTableOne.Rows[i]["PrimaryColumn"];
}

然后循环遍历dataTableTwo中的行,并检查table2中的主键是否与任何主键匹配,如果匹配,则将其添加到适当的datatable中

foreach (DataRow dr in dataTableTwo.Rows)
{
    var key2 = (string) dr["PrimaryColumn"] ;

    for (int j= 0 ; j < dataTableOne.Rows.Count ; j++)
    {
        if (key2.Contains(primaryKeys[j]))
            dataTables[j].Rows.Add(dr);
    }
}

最后,您应该得到1000个数据表

for (int j= 0 ; j < dataTableOne.Rows.Count ; j++)
{
    // Process Business logic on dataTables[j] 
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM