私は、データベースにクエリを実行してデータを1つのデータテーブルにプルし、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に表示します。
これは現在期待どおりに機能しますが、Big O表記が正しければ、O(m * n)を処理しています。これは、データセットが大きくなると非常に遅くなり、プロセッサに非常に負荷がかかります。
使用しているExcelスプレッドシートの一部は40,000行に近いため、すべての行をループするよりも効率的な方法を探しています。このアルゴリズムは、そのサイズのセットで完了するのに約6分かかります。