【问题标题】:New to C#, how to update data table (or join table)?C# 新手,如何更新数据表(或连接表)?
【发布时间】:2021-12-04 20:32:39
【问题描述】:

我是 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语句的方法:

    update table1 where 
table1.name = table2.name and 
table1.MemberNoA = table2.MemberNo2 
set table1.Remark = "Criteria 1 match\r\n"

有没有办法在 C# 中做到这一点或任何优化它的方法?谢谢。

注册 林志峰

【问题讨论】:

    标签: c# join datatable


    【解决方案1】:

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

    但其实根本不需要加入,分组的结果其实可以直接保存相关的数据行。

    下面的代码应该足够高效

    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";
    

    【讨论】:

    • 这项工作,非常感谢。我以传统的 SQL 方式思考,很难理解为什么“var grp”可以通过“var row”进一步迭代以及为什么“var row”(聚合后)有“remark”字段供我操作〜我需要一些时间清除概念〜谢谢。 ^_^
    • 因为每一个grp实际上都是IEnumerable&lt;DataRow&gt;,所以它是一个循环中的循环
    【解决方案2】:

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

    【讨论】:

    • 能否请您提供一个示例?谢谢
    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 1970-01-01
    • 2017-11-10
    • 1970-01-01
    • 2023-03-02
    • 2018-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多