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

C#中按日期排序dd/mm/yyyy格式的Listbox内容

问题:ListBox中日期无法按逻辑时间顺序排序

现有场景:使用WinForms的ListBox和日期选择器,用户选择日期后添加到ListBox,需要将ListBox内的日期按从早到晚逻辑排序,但尝试Sorted ListBox和现有手动排序代码时,均按字符串字典序排序,无法得到正确结果。

示例数据

  • 原数据(添加顺序):
    01/01/2023
    02/12/2022
    23/12/2022
    24/12/2022
    
  • 期望排序结果:
    02/12/2022
    23/12/2022
    24/12/2022
    01/01/2023
    
  • 实际错误结果:与原数据顺序一致(字符串字典序排序)

现有代码

void Btn_add_holidayClick(object sender, EventArgs e)
{
    lstbx_annual_hol.Items.Add(DatePick_Hol_Date.Value.Day.ToString("D2") + "/" +
                                   DatePick_Hol_Date.Value.Month.ToString("D2") + "/" +
                                   DatePick_Hol_Date.Value.Year.ToString() +"\n");  

    SortAnnualHoliday();
}

void SortAnnualHoliday()
{
    ArrayList arList = new ArrayList(); 

    foreach (object obj in lstbx_annual_hol.Items)
    {
        arList.Add(obj);
    }
    
    arList.Sort(); 

    lstbx_annual_hol.Items.Clear();

    foreach(object obj in arList)
    {
        lstbx_annual_hol.Items.Add(obj); 
    }
}

解决方案

问题根源:当前代码直接存储和排序日期字符串,而DD/MM/YYYY格式的字符串字典序与时间逻辑顺序不匹配(比如01/01/2023的字符串开头是01,会排在02/12/2022的02前面)。要实现正确排序,需要基于DateTime类型的时间值进行比较。

方法1:存储DateTime对象,排序后格式化显示

修改添加逻辑,直接将DateTime对象存入ListBox,排序时基于DateTime的自然顺序,显示时再格式化为指定字符串:

void Btn_add_holidayClick(object sender, EventArgs e)
{
    // 直接添加DateTime对象,而非字符串
    lstbx_annual_hol.Items.Add(DatePick_Hol_Date.Value);
    SortAnnualHoliday();
}

void SortAnnualHoliday()
{
    // 将Items转换为DateTime列表并按时间顺序排序
    var sortedDates = lstbx_annual_hol.Items.Cast<DateTime>()
                                            .OrderBy(d => d)
                                            .ToList();

    lstbx_annual_hol.Items.Clear();
    // 添加时格式化为指定的日期字符串
    foreach (var date in sortedDates)
    {
        lstbx_annual_hol.Items.Add(date.ToString("dd/MM/yyyy"));
    }
}

方法2:自定义比较器,解析字符串为DateTime后排序

如果必须保留存储字符串的方式,可以在排序时使用自定义比较器,将字符串解析为DateTime再比较:

void SortAnnualHoliday()
{
    ArrayList arList = new ArrayList();
    foreach (object obj in lstbx_annual_hol.Items)
    {
        arList.Add(obj);
    }

    // 使用自定义比较逻辑,按DateTime的时间顺序排序
    arList.Sort(new Comparison<object>((x, y) => 
    {
        DateTime dateX = DateTime.ParseExact(x.ToString().Trim(), "dd/MM/yyyy", null);
        DateTime dateY = DateTime.ParseExact(y.ToString().Trim(), "dd/MM/yyyy", null);
        return dateX.CompareTo(dateY);
    }));

    lstbx_annual_hol.Items.Clear();
    foreach (object obj in arList)
    {
        lstbx_annual_hol.Items.Add(obj);
    }
}

注意事项

  • 使用DateTime.ParseExact时,确保格式字符串与存储的日期格式完全匹配(此处为dd/MM/yyyy),同时注意去除字符串中的换行符等无关字符,避免解析错误。
  • 方法1更推荐,直接操作DateTime类型可避免字符串解析的潜在问题,逻辑更清晰高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 17:20:27