如何在LINQ中对字符串类型的求和字段进行分组求和?
解决字符串类型Qty分组求和的问题
你的整体思路完全没问题——先截取Id前缀、再按分组聚合求和,核心问题就出在Qty是字符串类型,LINQ的Sum方法没法直接对字符串做数值求和,得先把字符串转成数值类型再处理。
错误根源
你代码里的ids.Sum(a => a.qty)直接对字符串调用Sum,但C#的LINQSum没有针对字符串的重载,编译器自然会报错提示无法转换类型。
修正后的完整代码
我们只需要在转换阶段把字符串Qty转成数值类型(比如int或decimal,根据业务需求选,这里用int举例),求和后如果需要返回字符串格式的结果,再转回去就行:
var res = _listOfProductIdAndStock .Where(ids => ids.product_sku.Contains("-")) .Select(ids => new { id = ids.product_sku.Split('-')[0], // 先把字符串Qty转为int类型,注意如果Qty可能有非数字值要加异常处理 qty = int.Parse(ids.qty) }) .GroupBy(item => item.id) .Select(group => new { id = group.Key, // 求和后转回字符串,匹配你预期的输出格式 qty = group.Sum(item => item.qty).ToString() }) .ToList();
额外优化提示
- 如果
Qty字段可能存在空值、非数字字符串的情况,建议用int.TryParse避免运行时异常:
.Select(ids => { if (int.TryParse(ids.qty, out int numericQty)) { return new { id = ids.product_sku.Split('-')[0], qty = numericQty }; } // 转换失败时可以返回null,后续过滤掉这类数据 return null; }) .Where(item => item != null) // 过滤转换失败的条目
- 另外
Split(Convert.ToChar("-"))可以简化成Split('-'),C#支持直接传入字符作为分隔符参数,代码更简洁。
这样处理后就能得到你想要的结果:[0] Id: "000123", Qty: "50"
内容的提问来源于stack exchange,提问作者DaniKR
相关产品推荐
相关产品推荐

