For Loop Is在整个循环持续时间内未运行

时间:2018-05-14 12:51:18

标签: c# loops

我有一组循环,可以在更新数量时添加或删除集合列表。 删除循环完美地工作,但是添加循环仅应用了缩短的次数。

这是循环

public async Task UpdateLineItemByOrderLineId(int orderLineId, int newQuantity)
    {
        var clientBasket = await GetBasketAsync();
        var lineItem = clientBasket.OrderLines.FirstOrDefault(x => x.OrderLineId == orderLineId);
        if (newQuantity == 0)
        {
            foreach (var m in lineItem.DelegatesList.Where(f=>f.OrderLineId == orderLineId))
            {
                lineItem.DelegatesList.Remove(m);
            }
            _orderLinesRepository.Delete(lineItem);
            _orderLinesRepository.Save();
        }
        else
        {
            lineItem.Quantity = newQuantity;

            if (lineItem.DelegatesList.Count > newQuantity)
            {
                for (int i = lineItem.DelegatesList.Count - 1; i >= newQuantity; --i)
                {
                    lineItem.DelegatesList.RemoveAt(i);
                }
            }
            if (lineItem.DelegatesList.Count < newQuantity)
            {
                for (int z = 0; z <= newQuantity - lineItem.DelegatesList.Count; z++)
                {
                    lineItem.DelegatesList.Add(new OrderDelegate());
                }
            }
            await _basketRepository.SaveAsync();
        }
    }

在样本数据上发生以下情况:
If newQuantity = 8 and delegateslists.count = 1只运行 4 次(taking delegateslist.count 5

我三倍检查了数学,但看不出为什么它没有运行了很多次。

2 个答案:

答案 0 :(得分:3)

for (int z = 0; z <= newQuantity - lineItem.DelegatesList.Count; z++)
{
    lineItem.DelegatesList.Add(new OrderDelegate());
}

您的for循环包含newQuantity - lineItem.DelegatesList.Count

lineItem.DelegatesList.Count随着循环的每次迭代而增加。

这意味着随着Z增加,它将与正在减少的数字进行比较。

即。 首次运行,z = 0,newQuantity = 8,lineItem.DelegatesList.Count = 1.

第二次运行,z = 1,newQuantity = 8,lineItem.DelegatesList.Count = 2.

第三次运行,z = 2,newQuantity = 8,lineItem.DelegatesList.Count = 3.

第四次运行,z = 3,newQuantity = 8,lineItem.DelegatesList.Count = 4.

第五次运行,z = 4,newQuantity = 8,lineItem.DelegatesList.Count = 5.

 z <= newQuantity - lineItem.DelegatesList.Count;

在第五次运行中,4&lt; = 8-5(3)。

您可以采取初始计数并改为使用它。

else
{
    lineItem.Quantity = newQuantity;
    int initialCount = lineItem.DelegatesList.Count;

    if (lineItem.DelegatesList.Count > newQuantity)
    {
        for (int i = lineItem.DelegatesList.Count - 1; i >= newQuantity; --i)
        {
                lineItem.DelegatesList.RemoveAt(i);
        }
    }
    if (lineItem.DelegatesList.Count < newQuantity)
    {
        for (int z = 0; z <= newQuantity - initialCount; z++)
        {
            lineItem.DelegatesList.Add(new OrderDelegate());
        }
    }
    await _basketRepository.SaveAsync();
}

答案 1 :(得分:0)

当您添加到lineItem.DelegatesList时,您会增加lineItems.DelegatesList.Count。这意味着它只会运行一半的次数。

在开始循环之前将计数存储在临时变量中,或者将项目添加到单独的列表中,之后将列表添加到line Item.DelegatesList