Поскольку цикл не работает в течение полного цикла - PullRequest
0 голосов
/ 14 мая 2018

У меня есть набор циклов, которые добавляются или удаляются из списка сбора при обновлении количества.Цикл удаления работает отлично, однако цикл добавления применяется только сокращенное количество раз.

Вот циклы

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 itработает только 4 раз (taking delegateslist.count до 5 )

Я трижды проверил математику, но не могу понять, почему она не работает в течение полного количества раз.

Ответы [ 2 ]

0 голосов
/ 14 мая 2018
for (int z = 0; z <= newQuantity - lineItem.DelegatesList.Count; z++)
{
    lineItem.DelegatesList.Add(new OrderDelegate());
}

Ваш цикл включает в себя 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 <= 8-5 (3). </p>

Вы можете просто взять начальный счет и поработать с ним.

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();
}
0 голосов
/ 14 мая 2018

Когда вы добавляете к lineItem.DelegatesList, вы увеличиваете lineItems.DelegatesList.Count. Это означает, что он будет работать только вдвое меньше, чем нужно.

Либо сохраните счет во временной переменной до начала цикла, либо добавьте элементы в отдельный список, добавив список в line Item.DelegatesList впоследствии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...