如何用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
相关产品推荐
相关产品推荐

