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的逻辑完全不符合需求:
TakeWhile会在条件不满足时立即停止遍历,处理完Pen1后,c.Qty -= qtyordered得到5-8=-3,小于0,循环直接终止,不会处理Pen2及之后的物品。- 直接给每个物品的
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
相关产品推荐
相关产品推荐

