[英]c# datatable - Selecting detail records from datatable for each master record effectively
我有一個主數據表,其中包含按發票編號排序的發票記錄。 我還有另一個數據表,其中包含按發票編號和行項目編號排序的所有這些發票記錄的詳細信息(行項目信息)。
如何從這兩個表中有效地創建一組發票對象。 對我來說,它看起來像是創建嵌套的 for 循環。外部 for 循環遍歷訂單表,內部 for 循環瀏覽訂單項表
我將保留一個臨時標識符,其中包含當前發票#,一旦在嵌套的 for 循環中找到不同的發票#,它將退出內部循環。
下面是我正在嘗試做的偽代碼
long currentInvoiceNumber=-1;
int CurrentJCounter=0;
for(int i=0;i<MasterTable.Rows.Count;i++)
{
currentInvoiceNumber=MasterTable.Rows[i]["invoiceno"];
Order oOrder = new Order();
for(int j=CurrentJCounter;j<ItemDetailsTable.Row.Count;j++)
{
if(currentInvoiceNumber!=ItemDetailsTable.Rows[j]["invoiceno"])
{
currentJCounter = j;
break;
}
else
{
oOrder.AddItem(ItemDetailsTable.Rows[j]);
}
}
lstOrders.Add(oOrder);
}
我必須提高 appln 的性能,我認為肯定會有比這更好的方法。 請建議
謝謝, 斯維拉普
為了改進,您應該訂購包含感興趣字段的第二個表,即內部循環目標表( ItemDetailsTable
)。 當然,它會導致負面影響,但可以避免不必要的內部循環條件 - 大於/小於。
我不知道,如果您使用 LINQ 到 Object/DataSet,它是否會自動應用。
方法一:
您可以使用 LINQ 來確定發票的所有行列表,例如:
var invoiceRows = (from r in ItemDetailsTable.Rows where r["invoiceno"].Equals(currentInvoiceNumber) select r);
(請注意,我現在還沒有對此進行測試——您可能不得不稍微擺弄一下 LINQ 語句,或者可能必須首先使用類型化的數據集。)
然后你可以遍歷結果:
foreach (var invoiceRow in invoiceRows)
{
oOrder.AddItem(invoiceRow);
}
但是,我不知道這是否會提高性能 - 但是,在閱讀代碼時它可能“看起來”更優雅;-)
至於退出內部循環:是否考慮到 ItemDetailsTable 行按發票編號“排序”? 如果不是,如果發票 B 的行位於發票 A 的兩行之間,您可能會丟失發票 A 的某些行,如
Row 1 for invoice A
Row 2 for invoice A
Row 1 for invoice B
Row 3 for invoice A
Row 2 for invoice B
...
方法 B
另一種方法可能如下:聲明一個字典,以發票編號作為鍵,例如
Dictionary<string, Order> orderList = new ...;
然后,僅迭代這些行:
for (int j = 0; j < ItemDetailsTable.Row.Count; j++)
{
if (!orderList.ContainsKey(ItemDetailsTable.Row[j]["invoiceno"]))
orderList[ItemDetailsTable.Row[j]["invoiceno"]] = new Order();
Order oOrder = orderList[ItemDetailsTable.Row[j]["invoiceno"]];
oOrder.AddItem(ItemDetailsTable.Rows[j]);
}
最后,您可以通過鍵(發票號)或直接使用字典的值集合來訪問所有發票。
編輯
作為接近 b 的注釋:
最后,字典可能不包含MasterTable
中的所有發票編號 - 如果沒有發票編號行,則不會添加任何條目。 您可以通過在迭代行之前為MasterTable
中的每個發票編號添加一個條目來解決此問題。
此外,字典可能最終包含不在MasterTable
中的發票編號。 這些不會包含在您的嵌套循環方法中。 通過在迭代行之前在單獨的循環中添加發票編號,然后修改我的代碼示例,以便如果發票編號尚未在字典中,則不會在字典中創建新項目,您也可以防止這種情況發生。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.