循环执行中精准控制条件:暂停时长计算方法优化咨询
解决CalculateBreak方法中跳过短暂停报错的问题
嘿,我来帮你搞定这个需求!首先咱们先梳理下你的核心诉求:你写的CalculateBreak方法现在会在单个暂停时长小于30分钟时抛出error1,但你希望在特定条件满足时跳过这个报错逻辑,同时还要保留总暂停时长小于60分钟时的error2,对吧?
先说说你当前代码里的几个小问题,方便咱们后续优化:
- 内层的
for (int n=i-1;...)循环其实没起到循环作用,因为里面直接break了,完全可以简化成直接取i-1索引的元素 - 错误信息的覆盖逻辑有点混乱:比如后面的
error2会覆盖前面的error1或OK,导致你可能看不到真实的错误原因 - 没有处理边界情况(比如
arrivals为空或元素不足2个),容易出现空引用异常
解决方案:添加可配置的跳过报错逻辑
我给你重构了代码,加入了一个可选参数来控制是否跳过短暂停的报错,你也可以根据自己的实际需求调整这个“符合条件”的判断逻辑:
private double CalculateBreak(List<PRAESENZZEIT> arrivals, out string error, bool skipShortPauseError = false) { error = null; double totalBreak = 0; // 先处理边界情况:避免空列表或元素不足导致的异常 if (arrivals == null || arrivals.Count < 2) { error = "error_invalid_input"; return 0; } for (int i = 1; i < arrivals.Count; i++) { // 直接取前一个时间段的结束时间,简化原有的内层循环逻辑 var previousEntry = arrivals[i-1]; double pause = (arrivals[i].ZPZ_Von - previousEntry.ZPZ_Bis).TotalMinutes; totalBreak += pause; // 核心逻辑:只有当不跳过短暂停检查,且暂停时长小于等于30分钟时,才设置error1 if (!skipShortPauseError && pause <= 30) { error = "error1"; // 如果你想遇到第一个短暂停就直接返回结果,可以在这里加 return totalBreak; } // 如果当前暂停符合要求,且之前有error1,就把错误清除为OK else if (pause > 30 && error == "error1") { error = "OK"; } } // 最后检查总暂停时长,优先级高于单个暂停的错误 if (totalBreak < 60) { error = "error2"; } // 如果没有任何错误,默认设置为OK else if (error == null) { error = "OK"; } return totalBreak; }
如何使用这个方法
- 正常检查短暂停:不需要跳过报错时,直接调用即可
List<PRAESENZZEIT> yourArrivals = // 填充你的时间段数据 string errorMsg; double totalPause = CalculateBreak(yourArrivals, out errorMsg);
- 跳过短暂停报错:当你需要符合条件(比如用户是VIP、特定日期等)时,传入
skipShortPauseError: true
// 假设这里的yourCondition是你自己的判断逻辑,比如总时长已经达标、特殊用户等 bool yourCondition = true; double totalPause = CalculateBreak(yourArrivals, out errorMsg, yourCondition);
自定义“符合条件”的逻辑
如果你不想用参数控制,而是想根据方法内部的状态来判断(比如总暂停时长已经超过60分钟时自动跳过),可以把核心判断改成这样:
// 当总暂停时长已经>=60,或者手动设置跳过,就不触发error1 if (!(totalBreak >= 60 || skipShortPauseError) && pause <= 30) { error = "error1"; }
这样就能灵活满足你的需求啦,你可以根据实际业务场景调整判断条件哦~
内容的提问来源于stack exchange,提问作者lasta
相关产品推荐
相关产品推荐

