C# Linq多值排序:带优先级的TimeSpan字段排序实现问题
正确实现代码
var tmpList = Persons // 先过滤掉两个时间字段都为0的无效元素 .Where(x => x.OfficialTime > TimeSpan.Zero || x.Time > TimeSpan.Zero) // 按规则计算每个元素的排序键后统一升序排列 .OrderBy(x => x.OfficialTime > TimeSpan.Zero ? x.OfficialTime : x.Time) .ToList();
原代码问题说明
- 排序逻辑不符合规则:原代码强制先按
OfficialTime字段排序,会导致OfficialTime为0的元素全部排到其他有有效值的OfficialTime元素之前,和“OfficialTime为0时用Time字段参与全局排序”的要求冲突 - 执行顺序不合理:原代码先排序再过滤,虽然不会直接导致结果错误,但先过滤无效元素可以减少排序运算量,执行效率更高
结果验证
使用提供的测试数据执行上述代码,输出结果和预期完全匹配:
- Person2 排序键为00:02:55(取OfficialTime)
- Person3 排序键为00:02:56(OfficialTime为0,取Time)
- Person5 排序键为00:02:57(取OfficialTime)
- Person6 排序键为00:02:58(取OfficialTime)
- Person1 排序键为00:03:01(取OfficialTime)
内容的提问来源于stack exchange,提问作者Cainnech
相关产品推荐
相关产品推荐

