我是 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 條記錄具有相同的名稱和相同的 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# 中做到這一點或有什么方法可以優化它嗎?謝謝。
林志峰
uj5u.com熱心網友回復:
您可以做的是使用哈希表,對資料進行排序,然后使用游標迭代比較當前行資料與先前行資料。這應該給你 Log(n) 時間復雜度。
uj5u.com熱心網友回復:
問題是您在分組結果和原始資料表之間進行笛卡爾連接,而不使用任何高性能資料結構,例如字典或哈希集。
但其實根本不需要join,分組的結果其實可以直接保存相關的資料行。
以下代碼應該足夠性能
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";
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/321442.html
下一篇:執行緒測驗
