C#判断字符串数组是否含数字并按规则混合排序实现
实现方案
首先清掉你原有代码里的冗余逻辑:
Array.Sort(str)是无效调用,后续LINQ排序会完全覆盖这次排序结果,没有任何实际作用- 外层的foreach循环完全多余,循环内每次都会重复执行全数组排序和字符串拼接,属于无意义的性能损耗,最终结果和直接执行一次排序拼接没有区别
核心排序逻辑不需要拆分数字、普通字符串分别排序再合并,直接在排序键选择器里统一计算权重即可:
对每个元素统一生成int类型的排序权重,规则完全匹配你的需求:
- 用
int.TryParse判断元素是否为纯数字字符串 - 是数字:直接用解析出的整数值作为排序权重
- 是普通字符串:用字符串本身的字符长度作为排序权重
因为两类元素的权重统一为int类型,直接按权重升序排就能得到你要的结果。如果遇到权重相同的场景(比如普通字符串"b"长度为1,数字字符串"1"解析后值为1,二者权重相等),可以追加次排序规则,比如约定同权重下普通字符串排在数字前面,同类型按字典序排列即可。
优化后的可直接运行代码如下:
class Program { static void Main(string[] args) { string[] str = { "aaa", "cccc", "a", "2" }; var sortedResult = str.OrderBy(item => { if (int.TryParse(item, out int numericVal)) { return numericVal; } return item.Length; }) // 同权重下的次排序规则:普通字符串在前,数字在后,同类型按字典序排 .ThenBy(item => int.TryParse(item, out _) ? 1 : 0) .ThenBy(item => item); Console.WriteLine(string.Join(", ", sortedResult)); } }
运行你给出的测试用例,输出结果和预期完全一致:
a, 2, aaa, cccc
如果你实际需要的数字权重是数字字符串的字符长度(比如"2"长度为1,和"a"同权重;"12"长度为2,和长度为2的普通字符串同权重),只需要把排序键里数字分支的返回值改成item.Length即可,整体代码结构不需要调整。
内容的提问来源于stack exchange,提问作者user8512043
相关产品推荐
相关产品推荐

