C# 按指定筛选规则为列表计算TotalAmount及结果回写实现
代码问题定位与修正
现有实现的核心bug
- 类型不匹配编译报错:
Path是字符串类型,No是整数类型(示例中为1000、1001这类ID值),而string.Contains()方法要求传入字符串参数,直接把数值类型的No传入会触发编译错误,根本无法运行。 - 模糊匹配存在误判:就算把
No转成字符串后直接做Path.Contains()判断,也会出现子串误匹配的问题——比如No=100、Path="1000"时,"1000"确实包含子串"100",但路径层级中根本不存在100这个节点,不符合点分路径的结构规则。 - 没有结果回写逻辑:循环里算出来的
totalAmount只是个临时局部变量,没有赋值给当前记录的TotalAmount属性,哪怕计算逻辑对了,原列表的内容也不会有任何变化。
修正后的实现步骤
首先需要先给原有的记录类补充TotalAmount属性(类型和Amount保持一致即可),再调整计算和回写逻辑:
// 示例记录类结构 public class DataRecord { public int No { get; set; } public string Path { get; set; } public string A { get; set; } public string B { get; set; } public string C { get; set; } public decimal Amount { get; set; } // 新增的计算列 public decimal TotalAmount { get; set; } } // 遍历计算逻辑 foreach (var record in originalList) { // 把当前记录的No转成字符串,用于路径节点匹配 string currentNoText = record.No.ToString(); var totalAmount = originalList .Where(item => // 按点分割Path为节点列表,判断是否包含当前No(避免子串误匹配) item.Path.Split('.').Contains(currentNoText) && // 严格匹配A、B、C三列值完全一致 item.A == record.A && item.B == record.B && item.C == record.C ) .Sum(item => item.Amount); // 关键回写步骤:把计算结果存入当前记录的TotalAmount列 record.TotalAmount = totalAmount; }
结果验证
拿示例数据跑一遍逻辑:
- 索引1的记录:No=1000,A/B/C=a/b/c,匹配到的记录为索引1(Path="1000"含节点1000、a/b/c)、索引2(Path="1000.1001"含节点1000、a/b/c),求和700+100=800,和预期一致。
- 索引2的记录:No=1001,A/B/C=a/b/c,仅匹配到自身(Path="1000.1001"含节点1001、a/b/c,索引3的C值为d不匹配),求和100,和预期一致。
- 索引3的记录:No=1001,A/B/C=a/b/d,仅匹配到自身,求和200,和预期一致。
内容的提问来源于stack exchange,提问作者Termigez
相关产品推荐
相关产品推荐

