C#新手,如何更新数据table(或加入table)?

New to C#, how to update data table (or join table)?

我是 C# 的新手(之前有其他语言的经验,C++,SQL AutoIT)。我有一个包含 10 列的数据表

Name, MemberNoA, MemberNoB, DriverLicense, MobileNo, Address1, Address2, Address3, ProgramJoinned, Remark

数据表大约有17,000行,我想做的是,如果同一个人的记录在数据表中出现超过2次,则在备注字段中进行描述。 4个条件定义“同一人”,任何一个条件匹配都将被视为“同一人”

i Name + MemberNoA
ii Name + MemberNoB
iii Name + DriverLicense
iv Name + MobileNo

即如果有3条记录相同的Name和相同的MemberNoA,需要在这3条记录的备注字段中添加描述。

我根据上面的 4 个标准计算出这样的结果集:

var resultCriteria1 = from gpr in dt.AsEnumerable()
group gpr by new {
  Fld1 = gpr.Field < string > ("Name"),
    Fld2 = gpr.Field < string > ("MemberNoA")
}
into grpp
where grpp.Count() > 2
select new {
  Name = grpp.Key.Fld1,
    MemA = grpp.Key.Fld2,
    Cnt = grpp.Count()
};

之后,我遍历 dt 中的所有行,对于每一行,遍历 4 个条件中的所有结果集:

for (int i = 1; i < dt.Rows.Count; i++) {
  foreach(var item in resultCriteria1) {
    if ((item.Nam == s trName) && (item.MemA == M emberNoA)) {
      dt.Rows[i].ItemArray[9] = d t.Rows[i].ItemArray[9] + "Criteria 1 match\r\n";
    }
  }
}

程序工作但是 运行 非常慢!有没有像简单的 sql statement:

这样的方法
    update table1 where 
table1.name = table2.name and 
table1.MemberNoA = table2.MemberNo2 
set table1.Remark = "Criteria 1 match\r\n"

有没有什么方法可以在 C# 中执行此操作或有什么方法可以优化它?谢谢。

注册 林志峰

您可以做的是使用哈希表,对数据进行排序,然后使用游标迭代比较当前行数据与先前行数据。这应该给你 Log(n) 时间复杂度。

问题是您在分组结果和原始数据表之间进行笛卡尔连接,而没有使用任何高性能数据结构,例如字典或哈希集。

但实际上根本不需要join,分组后的结果其实可以直接hold住相关的数据行

下面的代码应该足够高效

var grouped =
    from gpr in dt.Rows.Cast<DataRow>()
    group gpr by (
      Fld1: (string)gpr["Name"],
      Fld2: (string)gpr["MemberNoA"]
    )
    into grpp
    where grpp.Count() > 2
    select grpp;

foreach (var grp in grouped)
    foreach (var row in grp)
        row["Remark"] += "Criteria 1 match\r\n";