我在DataTable
中有大约10万条记录,默认值列EdgeId
为0
我正在使用以下linq
查询在此表中插入值
foreach (IEdge ed in edCol)
{
var row = from r in dtRow.AsEnumerable()
where (((r.Field<string>("F1") == ed.Vertex1.Name) &&
(r.Field<string>("F2") == ed.Vertex2.Name)) ||
((r.Field<string>("F1") ==ed.Vertex2.Name) &&
(r.Field<string>("F2") == ed.Vertex1.Name)))
select r;
foreach (DataRow rows in row)
{
row["EgdeId"]=ed.Id;
}
}
内部foreach loop
需要执行大部分时间。
有没有更好的方法在DataTable
中插入记录而不使用foreach loop
DataRow
每个{{1}}?
答案 0 :(得分:0)
看起来你正在为edCol中的每个项目迭代dtRow。如果dtRow中的项目数量很大,并且匹配项目的数量相对较少,则可以预处理dtRow以构建从(ed.Vertex1.Name,ed.Vertext2.Name)到行列表的有效映射。例如Dictionary&lt; Tuple&lt; string,string&gt;,List&lt; DataRow&gt;&gt;。
答案 1 :(得分:0)
var query = from r in dtRow.AsEnumerable()
from ed in edCol
let f1 = r.Field<string>("F1")
let f2 = r.Field<string>("F2")
let v1 = ed.Vertex1.Name
let v2 = ed.Vertex2.Name
where (f1 == v1 && f2 == v2) ||
(f1 == v2 && f2 == v1)
select new { Row = r, EdgeId = ed.Id };
foreach(var item in query)
item.Row["EgdeId"] = item.EdgeId;