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