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

