我正在我的应用程序中开发一些功能,查询我们的数据库并将数据拉到一个数据表中,然后打开一个 excel 文件并填充另一个数据表。
因为 excel 文件不包含可用的 ID,所以我无法对数据进行排序,并且可能无法使用DataTable.Merge()
.
这是我创建的匹配算法的代码。
private void RunMatchingAlgorithm()
{
// Initialize variables
string partNumber = "";
DateTime expiration_date = DateTime.Now;
decimal contract_cost = 0;
string contract_no = "";
string partNumber2 = "";
DateTime expiration_date2 = DateTime.Now;
decimal contract_cost2 = 0;
string contract_no2 = "";
//Get values from DataBase
for (int i = 0; i < dtFromTableContracts.Rows.Count; i++)
{
partNumber2 = dtFromTableContracts.Rows[i]["supplier_part_no"].ToString();
contract_no2 = dtFromTableContracts.Rows[i]["contract_no"].
expiration_date2 = Convert.ToDateTime(dtFromTableContracts.Rows[i]["con_end_date"]).Date;
//Get Values from converted Excel table
for (int j = 0; j < dtConversion.Rows.Count; j++)
{
contract_no = dtConversion.Rows[j]["vend_contract_no"].ToString();
//If we have even a partial match, check for a part number match
if (contract_no2.StartsWith(contract_no))
{
partNumber = dtConversion.Rows[j]["vend_item_id"].ToString();
//If the values match, populate from both tables
if (partNumber == partNumber2)
{
dtConversion.Rows[j]["wpd_expiration_date"] = expiration_date2.Date;
dtConversion.Rows[j]["wpd_cont_cost"] = dtFromTableContracts.Rows[i]["contract_cost"];
dtConversion.Rows[j]["wpd_contract_no"] = dtFromTableContracts.Rows[i]["contract_no"];
dtConversion.Rows[j]["wpd_item_id"] = dtFromTableContracts.Rows[i]["supplier_part_no"];
dtConversion.Rows[j]["wpd_item_no"] = dtFromTableContracts.Rows[i]["item_id"];
dtConversion.Rows[j]["discontinued"] = dtFromTableContracts.Rows[i]["discontinued"];
dtConversion.Rows[j]["job_no"] = dtFromTableContracts.Rows[i]["job_no"];
}
}
}
}
}
如果您好奇,稍后的方法会删除所有不匹配的行,并且我们仅在 DGV 中显示匹配的记录。
这目前按预期工作,但如果我的大 O 表示法是正确的,我正在处理 O(m*n) ,它在更大的数据集下变得相当慢,并且处理器密集度极高。
我正在寻找一种更有效的方法来完成此任务,而不是遍历每一行,因为我们使用的一些 excel 电子表格接近 40,000 行。这个算法需要大约 6 分钟才能完成这个大小的集合。