You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#判断字符串数组是否含数字并按规则混合排序实现

实现方案

首先清掉你原有代码里的冗余逻辑:

  • Array.Sort(str)是无效调用,后续LINQ排序会完全覆盖这次排序结果,没有任何实际作用
  • 外层的foreach循环完全多余,循环内每次都会重复执行全数组排序和字符串拼接,属于无意义的性能损耗,最终结果和直接执行一次排序拼接没有区别

核心排序逻辑不需要拆分数字、普通字符串分别排序再合并,直接在排序键选择器里统一计算权重即可:
对每个元素统一生成int类型的排序权重,规则完全匹配你的需求:

  1. 用int.TryParse判断元素是否为纯数字字符串
  2. 是数字:直接用解析出的整数值作为排序权重
  3. 是普通字符串:用字符串本身的字符长度作为排序权重

因为两类元素的权重统一为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 22:27:33