C#如何按另一列表匹配优先级排序,再按字符串序降序排列
优化实现方案
方案1:抽离排序逻辑+使用Linq原生方法(可读性最高)
将匹配优先级计算的逻辑抽成独立的命名方法,逻辑意图无需阅读内部代码即可直接识别:
// 计算字符串在优先列表中的匹配排名,匹配返回对应索引,无匹配返回int.MaxValue int GetPreferredOrderIndex(string input) { var matchIndex = Array.FindIndex(preferred, pref => input.Contains(pref, StringComparison.OrdinalIgnoreCase)); return matchIndex == -1 ? int.MaxValue : matchIndex; } // 排序逻辑 var sortedThings = things .OrderBy(GetPreferredOrderIndex) .ThenByDescending(str => str, StringComparer.OrdinalIgnoreCase) .ToArray();
优化说明
- 把原本嵌套在
OrderBy中的手写循环逻辑抽成独立方法,方法名直接说明功能作用,可读性大幅提升 - 用.NET原生的
Array.FindIndex代替自定义for循环,减少冗余代码和出错概率 - 原代码
ThenByDescending(x => x.ToLower())优化为直接传入大小写不敏感的字符串比较器,避免额外生成小写字符串,性能和可读性均有提升
方案2:内联精简版(适合逻辑简单不想额外声明方法的场景)
var sortedThings = things .OrderBy(str => Array.FindIndex(preferred, p => str.Contains(p, StringComparison.OrdinalIgnoreCase)) is var idx and >=0 ? idx : int.MaxValue) .ThenByDescending(str => str, StringComparer.OrdinalIgnoreCase) .ToArray();
两种方案运行结果均完全符合示例要求。
内容的提问来源于stack exchange,提问作者Ian Newson
相关产品推荐
相关产品推荐

