TimeSpan求和遇Null值时,如何传入"00:00:00"避免程序崩溃?
解决TimeSpan求和时遇到Null/无效格式崩溃的问题
嘿,我来帮你捋清楚问题出在哪,再给你几个实用的解决方案~
为什么你的代码会崩溃?
你原来的代码@Model.Sum(x=> TimeSpan.Parse(x.Time ?? "00:00:00").Minutes)有两个潜在的坑:
??只处理null,不处理空字符串:如果x.Time是空字符串""(而不是null),??运算符不会生效,TimeSpan.Parse("")会直接抛出FormatException导致崩溃。- 未处理无效格式的字符串:如果
x.Time是其他不符合TimeSpan格式的字符串(比如"abc"、"123"),TimeSpan.Parse同样会抛出异常。
靠谱的解决方案
方案1:在Sum里直接用安全解析(适合快速实现)
用TimeSpan.TryParse替代Parse,同时处理null、空字符串和无效格式的情况:
@Model.Sum(x => { // 先处理x本身为null的情况(如果Model里可能存在null元素) if (x == null || string.IsNullOrEmpty(x.Time)) { return 0; // 对应00:00:00的分钟数 } // 安全解析,失败就返回0 return TimeSpan.TryParse(x.Time, out var timeSpan) ? timeSpan.Minutes : 0; })
⚠️ 注意:如果你需要的是总时长的分钟数(比如1小时30分钟算90分钟,而不是仅取分钟部分的30),请把timeSpan.Minutes换成timeSpan.TotalMinutes,记得根据需求转成合适的数值类型(比如(int)timeSpan.TotalMinutes)。
方案2:封装扩展方法(更优雅,复用性强)
如果这个场景在项目里多次出现,建议在后台写一个扩展方法:
// 新建一个静态类,比如StringExtensions.cs public static class StringExtensions { public static TimeSpan ToSafeTimeSpan(this string timeString) { // 处理null、空字符串,以及解析失败的情况,默认返回00:00:00 if (string.IsNullOrEmpty(timeString) || !TimeSpan.TryParse(timeString, out var result)) { return TimeSpan.Zero; } return result; } }
然后在视图里就可以简化成:
@Model.Sum(x => x?.Time.ToSafeTimeSpan().Minutes ?? 0)
这样代码更整洁,也方便后续复用。
额外提醒
如果你的Model集合里可能存在null元素(比如IEnumerable<YourType>里有null项),一定要先判断x != null,或者提前过滤掉null元素:
@Model.Where(x => x != null).Sum(x => x.Time.ToSafeTimeSpan().Minutes)
内容的提问来源于stack exchange,提问作者Syed Safeer Ul Hassan
相关产品推荐
相关产品推荐

