C#中如何创建匹配数值范围/数量区间与价格的并行数组并计算订单总金额
针对你的C#并行数组与定价计算问题的解决方案
嘿,我来帮你一步步梳理这两个技术需求的解决方案:
问题1:创建存储数值范围但仅含少量价格的并行数组
首先明确:C#没有专门用于“并行数组”的特定关键字,但我们可以通过逻辑关联两个数组(或者用更优雅的面向对象方案)来实现「数值范围对应价格」的映射。
并行数组的核心思路是让两个数组的索引一一对应——比如一个数组存区间边界,另一个存对应价格,通过索引关联两者的关系。不过直接用这种方式要注意逻辑严谨性,避免索引错位。
问题2:基于数量区间的定价数组设计与金额计算
你原来的代码思路有个明显问题:如果把每个餐品数量都塞进mealOrder数组,不仅代码冗余(要写40个元素),而且扩展性极差(比如后续数量上限调到100,代码会变得非常臃肿)。下面是更合理的实现方案:
方案1:用区间边界数组实现「伪并行数组」
我们只需要存储每个定价区间的上限值和对应的单价,通过逻辑判断找到对应区间:
// 存储每个区间的上限(最后一个用int.MaxValue代表“40及以上”) int[] quantityUpperLimits = { 10, 20, 39, int.MaxValue }; decimal[] unitPrices = { 14.99M, 12.50M, 10.75M, 9.45M }; // 根据订购数量获取对应单价的方法 public static decimal GetUnitPrice(int orderQuantity) { for (int i = 0; i < quantityUpperLimits.Length; i++) { if (orderQuantity <= quantityUpperLimits[i]) { return unitPrices[i]; } } return 0; // 处理无效数量(比如0或负数) } // 计算订单总金额 int orderedMeals = 25; decimal totalAmount = orderedMeals * GetUnitPrice(orderedMeals); Console.WriteLine($"总金额:{totalAmount:C}"); // 输出:总金额:$268.75
方案2:更推荐的面向对象实现(可读性&扩展性更强)
如果你的业务逻辑后续可能调整定价区间,用自定义类封装定价规则会更清晰:
// 定义定价区间类 public class MealPricingTier { public int MinQuantity { get; set; } public int? MaxQuantity { get; set; } // 用null表示无上限 public decimal UnitPrice { get; set; } } // 初始化定价规则列表 var pricingTiers = new List<MealPricingTier> { new MealPricingTier { MinQuantity = 1, MaxQuantity = 10, UnitPrice = 14.99M }, new MealPricingTier { MinQuantity = 11, MaxQuantity = 20, UnitPrice = 12.50M }, new MealPricingTier { MinQuantity = 21, MaxQuantity = 39, UnitPrice = 10.75M }, new MealPricingTier { MinQuantity = 40, MaxQuantity = null, UnitPrice = 9.45M } }; // 获取单价的方法(用LINQ简化逻辑) public static decimal GetUnitPrice(int orderQuantity, List<MealPricingTier> tiers) { var matchingTier = tiers.FirstOrDefault(tier => orderQuantity >= tier.MinQuantity && (tier.MaxQuantity == null || orderQuantity <= tier.MaxQuantity)); return matchingTier?.UnitPrice ?? 0; // 无匹配时返回0,可根据需求调整 } // 计算总金额 int orderedMeals = 45; decimal totalAmount = orderedMeals * GetUnitPrice(orderedMeals, pricingTiers); Console.WriteLine($"总金额:{totalAmount:C}"); // 输出:总金额:$425.25
关键总结
- C#没有专门的“并行数组”关键字,通过索引关联两个数组是最直接的实现方式,但面向对象的方案更适合长期维护;
- 不要存储每个具体数量,而是存储区间边界,能极大减少代码冗余并提升扩展性;
- 计算总金额时,先通过数量匹配到对应单价,再执行
数量 × 单价的计算即可。
内容的提问来源于stack exchange,提问作者tengkuzulfadli




