Цикл не работает в течение всего цикла

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

Вот петли

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)

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

Удаление из повторяемого списка или добавление к нему может иногда вызывать проблемы. Часто лучше поместить добавляемые / удаляемые элементы в новый список во время итерации, а затем выполнить удаление / добавление впоследствии.

jason.kaisersmith 14.05.2018 14:56

Я считаю, что это newQuantity - lineItem.DelegatesList.Count, измените на newQuantity

Trey 14.05.2018 14:56

Вы меняете DelegateList.Count, добавляя элементы в список в вашем цикле, что обычно является источником проблем.

Halex 14.05.2018 14:57
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
3
90
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

Ответ принят как подходящий
for (int z = 0; z <= newQuantity - lineItem.DelegatesList.Count; z++)
{
    lineItem.DelegatesList.Add(new OrderDelegate());
}

Ваш цикл for включает newQuantity - lineItem.DelegatesList.Count.

lineItem.DelegatesList.Count увеличивается с каждой итерацией цикла.

Это означает, что по мере увеличения Z оно по сравнению с уменьшающимся числом.

I.E. Первый запуск, 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).

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

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();
}

Другие вопросы по теме