在这个例子中如何避免写三个循环?

时间:2016-09-19 21:34:25

标签: c# loops optimization

在下面的代码示例中,如何避免编写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);
}

2 个答案:

答案 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);
}