如何从CustDiscount列表中匹配与文章分类层级最贴合的对象
解决文章分组层级与CustDiscount对象的最匹配问题
我来帮你搞定这个需求——核心就是找到与文章分组层级前缀匹配最长的CustDiscount对象对吧?咱们一步步来实现:
步骤1:解析文章ID,生成所有可能的分组层级路径
首先得把articleId拆分,提取出从最长到最短的分组路径列表。比如对于"3.1.2.4.2015",我们要得到的优先级从高到低的路径依次是:
"3.1.2.4"(完整三级子分组)"3.1.2"(二级子分组)"3.1"(一级子分组)"3"(顶级分组)
如果文章ID的最后一位是动态数字(不是固定2015),可以用通用逻辑提取分组层级:
string articleId = "3.1.2.4.2015"; var idParts = articleId.Split('.'); // 取除最后一个元素外的所有部分,作为分组层级数组 var groupLevels = idParts.Take(idParts.Length - 1).ToArray(); // 生成从长到短的分组路径列表 var possibleGroups = Enumerable.Range(1, groupLevels.Length) .Reverse() .Select(n => string.Join(".", groupLevels.Take(n))) .ToList();
步骤2:从CustDiscount列表中查找最匹配的对象
有了优先级从高到低的分组路径,我们只需要按顺序查找,第一个匹配Group属性的对象就是最精准的最长前缀匹配项:
// 假设你的折扣列表是这个 List<CustDiscount> discountList = GetYourDiscountList(); CustDiscount bestMatch = null; foreach (var groupPath in possibleGroups) { bestMatch = discountList.FirstOrDefault(d => d.Group == groupPath); if (bestMatch != null) { break; // 找到最长匹配,直接退出循环 } } // 处理结果 if (bestMatch != null) { Console.WriteLine($"找到最匹配折扣:客户{bestMatch.CustomerId},分组{bestMatch.Group},折扣{bestMatch.Discount:P}"); } else { Console.WriteLine("未找到任何匹配的分组折扣"); }
完整可运行示例
把逻辑整合起来,这里给你一个完整的测试代码:
using System; using System.Collections.Generic; using System.Linq; public class CustDiscount { public string CustomerId { get; set; } public string Group{ get; set; } public decimal Discount { get; set; } public decimal Price { get; set; } } class Program { static void Main() { // 模拟测试用的折扣列表 var discountList = new List<CustDiscount> { new CustDiscount { CustomerId = "C001", Group = "3", Discount = 0.1m, Price = 100m }, new CustDiscount { CustomerId = "C002", Group = "3.1", Discount = 0.15m, Price = 100m }, new CustDiscount { CustomerId = "C003", Group = "3.1.2.4", Discount = 0.25m, Price = 100m }, new CustDiscount { CustomerId = "C004", Group = "2.1", Discount = 0.2m, Price = 80m } }; string articleId = "3.1.2.4.2015"; var idParts = articleId.Split('.'); var groupLevels = idParts.Take(idParts.Length - 1).ToArray(); var possibleGroups = Enumerable.Range(1, groupLevels.Length) .Reverse() .Select(n => string.Join(".", groupLevels.Take(n))) .ToList(); CustDiscount bestMatch = null; foreach (var groupPath in possibleGroups) { bestMatch = discountList.FirstOrDefault(d => d.Group == groupPath); if (bestMatch != null) { break; } } if (bestMatch != null) { Console.WriteLine($"=== 最匹配结果 ==="); Console.WriteLine($"客户ID:{bestMatch.CustomerId}"); Console.WriteLine($"匹配分组:{bestMatch.Group}"); Console.WriteLine($"折扣率:{bestMatch.Discount:P}"); Console.WriteLine($"原价:{bestMatch.Price:C}"); Console.WriteLine($"折后价:{bestMatch.Price * (1 - bestMatch.Discount):C}"); } else { Console.WriteLine("未找到任何匹配的分组折扣信息"); } } }
运行这段代码会输出匹配到的C003对象,也就是最长的3.1.2.4分组对应的折扣。
内容的提问来源于stack exchange,提问作者ProfileForStack4
相关产品推荐
相关产品推荐

