C# 如何按数组内日期对字典存储的List<string[]>实现升降序排序
实现方案
核心逻辑是先将字符串格式的日期解析为DateTime类型再做排序,通过一个布尔参数即可快速切换升降序模式。
方式1:原地排序(推荐,性能更高,直接修改原列表)
直接调用List<T>自带的Sort方法完成原地排序,无需生成新的集合实例:
using System; using System.Collections.Generic; using System.Globalization; // 排序方向参数:true=升序,false=降序,修改该值即可切换排序模式 bool isAscending = true; foreach (var dateList in years.Values) { dateList.Sort((item1, item2) => { // 按指定格式解析日期,避免系统时区/区域格式影响解析结果 DateTime date1 = DateTime.ParseExact(item1[0], "MM-dd-yyyy", CultureInfo.InvariantCulture); DateTime date2 = DateTime.ParseExact(item2[0], "MM-dd-yyyy", CultureInfo.InvariantCulture); int compareRes = date1.CompareTo(date2); // 根据排序方向参数返回对应比较结果 return isAscending ? compareRes : -compareRes; }); }
方式2:LINQ排序(灵活,可生成新列表不修改原数据)
如果需要保留原列表的顺序、生成新的排序后列表,可以用LINQ实现:
using System.Linq; using System.Globalization; bool isAscending = true; // 遍历字典键时调用ToList避免遍历过程中修改字典导致的异常 foreach (var yearKey in years.Keys.ToList()) { IOrderedEnumerable<string[]> orderedList = isAscending ? years[yearKey].OrderBy(item => DateTime.ParseExact(item[0], "MM-dd-yyyy", CultureInfo.InvariantCulture)) : years[yearKey].OrderByDescending(item => DateTime.ParseExact(item[0], "MM-dd-yyyy", CultureInfo.InvariantCulture)); years[yearKey] = orderedList.ToList(); }
效果验证
以你给出的2021年数据为例,升序排序后结果为:
["03-30-2021","246810"], ["06-30-2021","135791"], ["09-30-2021","123456"], ["12-30-2021","654321"]
修改isAscending为false即可得到降序结果。
内容的提问来源于stack exchange,提问作者TrialByErrors
相关产品推荐
相关产品推荐

