You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#实现从物品集合按指定数量扣减库存的问题

问题:从物品列表扣减订购数量的正确实现

需求说明:需要从物品列表的Qty属性中扣减指定的订购数量qtyordered(值为8)。

现有物品列表:

  • Pen1 5
  • Pen2 6
  • Pen3 7
  • Pen4 8

期望扣减后的输出结果:

  • Pen1 0
  • Pen2 3
  • Pen3 7
  • Pen4 8

用户当前使用的C#代码未达到预期效果:

using System;
using System.Collections.Generic;
                    
public class Program
{
    public static void Main()
    {
        int qtyordered = 8;
        var students = new List<Item>() { 
                new Item(){ ItemName = "Pen1", Qty=5},
                new Item(){ ItemName = "Pen2", Qty=6},
                new Item(){ ItemName = "Pen3", Qty=7},
                new Item(){ ItemName = "Pen4", Qty=8},
            };
        // How to subtract 8 in the list quantity
//I am doing like below but it is not working as expected
var x = students.TakeWhile(c => (c.Qty -= qtyordered) >= 0);
        // expected output is 
        //Pen1 0  // 5-8
        //Pen2 3  //6-3
        //Pen3 7
        //Pen4 8
        
        
    }
    class Item{
        public string ItemName{get; set;}
        public int Qty{get; set;}
    }
}

现有代码的问题

你用TakeWhile的逻辑完全不符合需求:

  1. TakeWhile会在条件不满足时立即停止遍历,处理完Pen1后,c.Qty -= qtyordered得到5-8=-3,小于0,循环直接终止,不会处理Pen2及之后的物品。
  2. 直接给每个物品的Qty减去8的操作逻辑错误,应该是优先扣减前面物品的库存,直到用完需要扣减的总数量,而不是每个物品都减8。

正确实现方式

我们需要维护一个剩余待扣减的数量,遍历物品列表时逐个处理:

  • 如果剩余待扣减数量为0,直接跳过后续物品
  • 计算当前物品能贡献的扣减量:取当前物品的Qty和剩余待扣减数量的较小值
  • 更新当前物品的Qty(减去贡献的扣减量)
  • 更新剩余待扣减数量(减去贡献的扣减量)

完整代码如下:

using System;
using System.Collections.Generic;
                    
public class Program
{
    public static void Main()
    {
        int qtyOrdered = 8;
        int remainingToDeduct = qtyOrdered;
        var items = new List<Item>() { 
                new Item(){ ItemName = "Pen1", Qty=5},
                new Item(){ ItemName = "Pen2", Qty=6},
                new Item(){ ItemName = "Pen3", Qty=7},
                new Item(){ ItemName = "Pen4", Qty=8},
            };
        
        foreach (var item in items)
        {
            if (remainingToDeduct <= 0)
                break;
            
            // 计算当前物品能扣减的数量
            int deductAmount = Math.Min(item.Qty, remainingToDeduct);
            item.Qty -= deductAmount;
            remainingToDeduct -= deductAmount;
        }
        
        // 输出结果验证
        foreach (var item in items)
        {
            Console.WriteLine($"{item.ItemName}    {item.Qty}");
        }
    }
    
    class Item
    {
        public string ItemName { get; set; }
        public int Qty { get; set; }
    }
}

运行这段代码后,会输出你期望的结果:

Pen1    0
Pen2    3
Pen3    7
Pen4    8

内容的提问来源于stack exchange,提问作者Andi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 13:05:10