0

在下面的代码中,我使用了 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
        */

        }
        }
4

2 回答 2

0

尝试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;
}
于 2013-10-28T13:43:30.360 回答
0

尚未对此进行测试,我不确定内存影响,但如果like是导致速度缓慢的命令,那么如果您通过循环遍历第一个 DataTable 并存储每 1000 条记录的 primaryKeys 来避免它怎么办并创建一个单独的 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 中的主键是否与任何主键匹配,如果匹配,则添加到适当的数据表

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] 
}
于 2015-06-06T13:31:52.693 回答