-1

DataTableデフォルト値の列EdgeIdが0の約10万件のレコードがあります

次の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は実行にほとんどの時間がかかります。

DataTablethis foreach loopfor eachを使用せずにレコードを挿入するより良い方法はありますDataRowか?

4

2 に答える 2

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;
于 2013-01-14T13:12:48.740 に答える
0

edCol の各項目に対して dtRow を繰り返しているようです。dtRow の項目数が多く、一致する項目の数が比較的少ない場合は、dtRow を前処理して、(ed.Vertex1.Name, ed.Vertext2.Name) から行のリストへの効率的なマッピングを作成できます。たとえば、Dictionary<Tuple<string,string>、List<DataRow>> などです。

于 2013-01-14T10:43:17.657 に答える