[英]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.