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

如何用jQuery或.NET C#对YearMonth格式文本数组排序?

如何使用jQuery或.NET C#对YearMonth格式文本数组按实际时间顺序排序?

已知Sort()方法仅能实现字母排序,需要最优的自定义排序方案。我已找到JavaScript的解决方法,现需获取.NET C#的实现方案。

原数组

MyArray = ['2019APR', '2019AUG', '2019DEC', '2019FEB', '2019JAN',  
'2019JUL', '2019JUN', '2019MAR', '2019MAY', '2019NOV', '2019OCT',  
'2019SEP', '2020APR', '2020AUG', '2020DEC', '2020FEB', '2020JAN',  
'2020JUL', '2020JUN', '2020MAR', '2020MAY', '2020NOV', '2020OCT', '2020SEP']

期望输出

['2019JAN', '2019FEB', '2019MAR', '2019APR', '2019MAY', '2019JUN',  
'2019JUL', '2019AUG', '2019SEP', '2019OCT', '2019NOV', '2019DEC',  
'2020JAN', '2020FEB', '2020MAR', '2020APR', '2020MAY', '2020JUN',  
'2020JUL', '2020AUG', '2020SEP', '2020OCT', '2020NOV', '2020DEC']

.NET C# 实现方案

方法一:解析为DateTime对象排序(直观易维护)

利用DateTime.ParseExact将字符串解析为日期对象,直接基于日期排序,代码可读性高,后续格式变更易调整:

using System;
using System.Linq;

class Program
{
    static void Main()
    {
        string[] myArray = { "2019APR", "2019AUG", "2019DEC", "2019FEB", "2019JAN",
                             "2019JUL", "2019JUN", "2019MAR", "2019MAY", "2019NOV", "2019OCT",
                             "2019SEP", "2020APR", "2020AUG", "2020DEC", "2020FEB", "2020JAN",
                             "2020JUL", "2020JUN", "2020MAR", "2020MAY", "2020NOV", "2020OCT", "2020SEP" };

        var sortedArray = myArray.OrderBy(s => DateTime.ParseExact(s, "yyyyMMM", null)).ToArray();
        
        // 输出排序结果
        foreach (var item in sortedArray)
        {
            Console.WriteLine(item);
        }
    }
}

方法二:自定义排序比较器(性能更优)

若对性能要求较高,可直接提取年份和月份编号进行比较,避免日期解析的开销:

using System;
using System.Collections.Generic;

class YearMonthComparer : IComparer<string>
{
    private static readonly Dictionary<string, int> _monthMap = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase)
    {
        {"JAN", 1}, {"FEB", 2}, {"MAR", 3}, {"APR", 4},
        {"MAY", 5}, {"JUN", 6}, {"JUL", 7}, {"AUG", 8},
        {"SEP", 9}, {"OCT", 10}, {"NOV", 11}, {"DEC", 12}
    };

    public int Compare(string x, string y)
    {
        // 比较年份
        int yearX = int.Parse(x.Substring(0, 4));
        int yearY = int.Parse(y.Substring(0, 4));
        if (yearX != yearY)
        {
            return yearX.CompareTo(yearY);
        }
        
        // 年份相同时比较月份
        int monthX = _monthMap[x.Substring(4)];
        int monthY = _monthMap[y.Substring(4)];
        return monthX.CompareTo(monthY);
    }
}

class Program
{
    static void Main()
    {
        string[] myArray = { "2019APR", "2019AUG", "2019DEC", "2019FEB", "2019JAN",
                             "2019JUL", "2019JUN", "2019MAR", "2019MAY", "2019NOV", "2019OCT",
                             "2019SEP", "2020APR", "2020AUG", "2020DEC", "2020FEB", "2020JAN",
                             "2020JUL", "2020JUN", "2020MAR", "2020MAY", "2020NOV", "2020OCT", "2020SEP" };

        Array.Sort(myArray, new YearMonthComparer());
        
        // 输出排序结果
        foreach (var item in myArray)
        {
            Console.WriteLine(item);
        }
    }
}

补充:jQuery/JavaScript 简洁实现参考

const monthMap = {JAN:1, FEB:2, MAR:3, APR:4, MAY:5, JUN:6, JUL:7, AUG:8, SEP:9, OCT:10, NOV:11, DEC:12};
const sortedArray = MyArray.sort((a,b) => {
    const yearA = parseInt(a.slice(0,4)), yearB = parseInt(b.slice(0,4));
    if(yearA !== yearB) return yearA - yearB;
    return monthMap[a.slice(4)] - monthMap[b.slice(4)];
});
console.log(sortedArray);

内容的提问来源于stack exchange,提问作者Darshak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 16:28:15