在下面的代码示例中,如何避免编写3个循环。我不确定如何保持代码可读并仍然优化它。这不是我正在研究的确切功能,但为了简洁起见,我更新了它,以便你们阅读。
int OrderQuantity = 5;
List<LineItem> Items = GetLineItems();
List<int> UniqueOrderIDs = new List<int>();
foreach (LineItem i in Items) {
if (UniqueOrderIDs.Contains(i.OrderID) == false) {
PurchaseOrder Order = GetOrder(i.OrderId);
Order.ModifiedDate = Now;
UpdateOrder(Order);
UniqueOrderIDs.Add(i.OrderID);
}
}
foreach (int id in UniqueOrderIDs) {
decimal TaxableAmount = 0;
foreach (LineItem i in Items) {
If(i.OrderID == id){
i.OrderQuantity = OrderQuantity;
UpdateItem(i)
TaxableAmount += i.Cost;
}
}
UpdateTaxAmount(id, TaxableAmount);
}
答案 0 :(得分:0)
你可以这样做(我省略边界检查)
List<LineItem> items = GetLineItems(OrderID);
var sorted = items.OrderBy(i=>i.OrderID);
int id = sorted.First().OrderID; //get 1st element's id
foreach (LineItem i in sorted.Skip(1)) //skip 1st one
{
if(i.OrderID == id)
{
i.OrderQuantity = OrderQuantity;
UpdateItem(i)
TaxableAmount += i.Cost;
}
else
id = i.OrderID;
}
....
您按LineItem
排序OrderID
列表,只需迭代它,然后它是相同的,做你需要做的任何事情。
有些人可能会选择LINQ
解决方案,但根据我的口味,这看起来更简单明了,然后LINQ
解决方案可能就是这种情况。
答案 1 :(得分:0)
我可能遗漏了一些东西(在这里迟到),但为什么你不能这样做:
var orderIdAndTaxableAmount = new Dictionary<int, decimal>();
foreach (LineItem i in Items) {
if (UniqueOrderIDs.Contains(i.OrderID) == false) {
PurchaseOrder Order = GetOrder(i.OrderId);
Order.ModifiedDate = Now;
UpdateOrder(Order);
UniqueOrderIDs.Add(i.OrderID);
}
i.OrderQuantity = OrderQuantity;
UpdateItem(i);
if (!orderIdAndTaxableAmount.ContainsKey(i.OrderId))
{
orderIdAndTaxableAmount.Add(i.OrderId, 0.0);
}
orderIdAndTaxableAmount[i.OrderId] += i.Cost;
}
foreach (var kvp in orderIdAndTaxableAmount)
{
UpdateTaxAmount(kvp.Key, kvp.Value);
}