在 c# 中更改 DataTable 的过滤 DataRows 非常非常慢
It is very very slow to change filtered DataRows of DataTable in c#
这里有一个代码是2 DataTables
。它们都填充了来自 SQL Server 2012 的 SqlDataAdabter
。dtParticipants
中有 15.000 行,dtSubjectResult
中有 80.000 行。
foreach (DataRow rowPart in dtParticipants.Rows)
{
int partId = int.Parse(rowPart["main_id"].ToString());
string partUserCode = rowPart["o_user_code"].ToString();
DataRow[] filteredRows = dtSubjectResult.Select("main_id = " + partId);
if (filteredRows == null)
continue;
foreach (DataRow row in filteredRows)
{
row["correct_count"] = 5;//unit.CorrectCount;
row["incorrect_count"] = 15;//unit.IncorrectCount;
row["empty_count"] = 20;//unit.EmptyCount;
row["net_count"] = 12;//unit.Total;
}//foreach 2
}//foreach 1
但是这段代码非常非常慢...当我在第二个foreach中注释代码时,代码运行非常正常,没有任何速度问题。
有趣的是,当我像这样尝试这段代码时,它工作得很好。
foreach (DataRow row in dtSubjectResult.Rows)
{
row["correct_count"] = 5;//unit.CorrectCount;
row["incorrect_count"] = 15;//unit.IncorrectCount;
row["empty_count"] = 20;//unit.EmptyCount;
row["net_count"] = 12;//unit.Total;
}
那么问题是什么...循环遍历过滤的行很慢吗?我不知道??
多重过滤操作严重影响性能
DataRow[] filteredRows = dtSubjectResult.Select("main_id = " + partId);
Select
需要解释过滤器表达式,在 dtSubjectResult
中的每 15k 次迭代中扫描 80k 行
Join
2 个表并一次性更新 dtSubjectResult
行:
var grouped = dtParticipants.AsEnumerable()
.Join(dtSubjectResult.AsEnumerable(),
rPart => (int)rPart["main_id"],
rSubj => (int)rSubj["main_id"],
(rPart, rSubj) => new { P = rPart, S = rSubj })
.GroupBy(x => x.P["main_id"]);
foreach (var gr in grouped)
{
foreach (var row in gr)
{
row.S["correct_count"] = 5;//unit.CorrectCount;
row.S["incorrect_count"] = 15;//unit.IncorrectCount;
row.S["empty_count"] = 20;//unit.EmptyCount;
row.S["net_count"] = 12;//unit.Total;
}
}
这里有一个代码是2 DataTables
。它们都填充了来自 SQL Server 2012 的 SqlDataAdabter
。dtParticipants
中有 15.000 行,dtSubjectResult
中有 80.000 行。
foreach (DataRow rowPart in dtParticipants.Rows)
{
int partId = int.Parse(rowPart["main_id"].ToString());
string partUserCode = rowPart["o_user_code"].ToString();
DataRow[] filteredRows = dtSubjectResult.Select("main_id = " + partId);
if (filteredRows == null)
continue;
foreach (DataRow row in filteredRows)
{
row["correct_count"] = 5;//unit.CorrectCount;
row["incorrect_count"] = 15;//unit.IncorrectCount;
row["empty_count"] = 20;//unit.EmptyCount;
row["net_count"] = 12;//unit.Total;
}//foreach 2
}//foreach 1
但是这段代码非常非常慢...当我在第二个foreach中注释代码时,代码运行非常正常,没有任何速度问题。
有趣的是,当我像这样尝试这段代码时,它工作得很好。
foreach (DataRow row in dtSubjectResult.Rows)
{
row["correct_count"] = 5;//unit.CorrectCount;
row["incorrect_count"] = 15;//unit.IncorrectCount;
row["empty_count"] = 20;//unit.EmptyCount;
row["net_count"] = 12;//unit.Total;
}
那么问题是什么...循环遍历过滤的行很慢吗?我不知道??
多重过滤操作严重影响性能
DataRow[] filteredRows = dtSubjectResult.Select("main_id = " + partId);
Select
需要解释过滤器表达式,在 dtSubjectResult
中的每 15k 次迭代中扫描 80k 行
Join
2 个表并一次性更新 dtSubjectResult
行:
var grouped = dtParticipants.AsEnumerable()
.Join(dtSubjectResult.AsEnumerable(),
rPart => (int)rPart["main_id"],
rSubj => (int)rSubj["main_id"],
(rPart, rSubj) => new { P = rPart, S = rSubj })
.GroupBy(x => x.P["main_id"]);
foreach (var gr in grouped)
{
foreach (var row in gr)
{
row.S["correct_count"] = 5;//unit.CorrectCount;
row.S["incorrect_count"] = 15;//unit.IncorrectCount;
row.S["empty_count"] = 20;//unit.EmptyCount;
row.S["net_count"] = 12;//unit.Total;
}
}