У меня есть набор циклов, которые добавляют или удаляют из списка коллекции при обновлении количества. Цикл удаления работает отлично, однако цикл добавления применяется только сокращенное количество раз.
Вот петли
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)
Я втрое проверил математику, но не могу понять, почему он не работает все время.
Я считаю, что это newQuantity - lineItem.DelegatesList.Count, измените на newQuantity
Вы меняете DelegateList.Count, добавляя элементы в список в вашем цикле, что обычно является источником проблем.





Когда вы добавляете 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();
}
Удаление из повторяемого списка или добавление к нему может иногда вызывать проблемы. Часто лучше поместить добавляемые / удаляемые элементы в новый список во время итерации, а затем выполнить удаление / добавление впоследствии.