如何通过LINQ对字符串格式的磁盘容量数值求和?
磁盘大小数值求和方案
嘿,你已经成功把带单位的磁盘大小字符串转成纯数字格式了,接下来要做求和其实很简单,核心就是把这些字符串转成可靠的数值类型再计算。这里推荐用decimal来处理,毕竟磁盘大小是精确的小数,用double容易出现精度丢失的问题。
完整实现代码
Size = a.Type == "Machines" ? { var totalDiskSize = a.Info.DiskInfo // 取出原始大小字符串 .Select(b => b.Size) // 剥离单位,仅保留数字和小数点 .Select(c => Regex.Replace(c, "[^0-9.]", "")) // 过滤空字符串或无法转换的无效值,避免抛出异常 .Where(s => !string.IsNullOrWhiteSpace(s) && decimal.TryParse(s, out _)) // 转换为decimal类型以保证计算精度 .Select(s => decimal.Parse(s)) // 对所有有效数值求和 .Sum(); // 将总和格式化为与原数据一致的两位小数字符串 totalDiskSize.ToString("0.00") } : null;
关键细节说明
- 过滤无效值:添加
Where条件是很实用的防御性编程手段,万一某个磁盘大小字符串处理后为空或格式异常,直接转换会导致程序崩溃,这一步能帮你避开这类问题。 - 优先使用decimal类型:磁盘大小通常是保留两位小数的精确值,
decimal的精度远高于double,不会出现类似0.1+0.2=0.30000000000000004的精度偏差问题。 - 安全转换备选方案:如果你不想过滤无效值,而是希望把转换失败的数值按0处理,可以换成
TryParse的写法:
.Select(s => { decimal.TryParse(s, out var size); return size; // 转换失败时默认返回0 })
额外提示
如果之后需要给总和加上单位(比如还原成"XX.XX GiB"的格式),直接在格式化时拼接即可:$"{totalDiskSize.ToString("0.00")} GiB"
内容的提问来源于stack exchange,提问作者HJain
相关产品推荐
相关产品推荐

