【发布时间】:2017-05-27 12:23:20
【问题描述】:
我有一个 DataTable,它有大约 800,000 行,由 4 列组成。 StartLocation、EndLocation、距离和区域。我要做的是,对于该特定区域中的每条记录,获取“相反”记录并查看距离是否小于原始记录。此 DataTable 中的每条记录都将有一个“相反”记录。
一个示例行,它的“相反”如下所示:
StartLoc | EndLoc | Distance | Zone
2, 1 4, 3 5 1
4, 3 2, 1 4 1
这里的问题是当前的解决方案非常耗时且简单。下面的代码就是现在采用的策略。
public DataTable ProcessTable(DataTable _tbl)
{
//copy the schema to new datatable
DataTable ProcessedTable = _tbl.Clone();
foreach (DataRow row in _tbl.Rows)
{
var ReverseRow = from DataRow revRow in _tbl.Rows
where revRow.Field<string>("StartLoc") == row.Field<string>("EndLoc")
where revRow.Field<string>("EndLoc") == row.Field<string>("StartLoc")
where revRow.Field<string>("Zone") == row.Field<string>("Zone")
select revRow;
DataRow result = ReverseRow.First<DataRow>();
int rowDistance = row.Field<int>("Distance");
int resultDistance = result.Field<int>("Distance");
if (resultDistance < rowDistance)
row["Distance"] = resultDistance;
ProcessedTable.Rows.Add(row.ItemArray);
}
return ProcessedTable;
}
我是 LINQ 新手,所以这个问题将分为 3 个部分:
- 有什么方法可以加快内部查询?
- 我能否将 foreach 循环和查询合并到一个优雅的 LINQ 行中,同时提高性能?
- 我认为这完全错误,需要改变我的方法吗?
【问题讨论】:
-
欢迎。这个问题在另一个 Stack Exchange 站点上可能会做得更好。也许代码审查?任何人?祝你好运!
-
你能考虑 StartLoc/EndLoc/Zone 的组合是唯一的吗?您可以在它们上添加主键并使用 Find 以获得良好的性能。
-
看来你可以应用约束 StartLoc
-
如果从数据库中获取DataTable,则应该在数据库上进行查询,而不是获取整个表。
标签: c# performance linq datatable