使用可能的 invalid/null 值以字符串格式对日期进行排序

Sorting date in string format with possible invalid/null values

我正在尝试使用 invalid/null 值对字符串格式的日期字段进行排序。但是,我没有得到预期的结果。

var dataList = new List<string>();

dataList.Add("12/01/2020");
dataList.Add("12/01/2021");
dataList.Add("11/09/2022");
dataList.Add("01/31/2022");
dataList.Add("99999999");
dataList.Add(null);

var result = dataList.OrderByDescending(x => 
   DateTime.TryParseExact(x, "MM/dd/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime endDate))
   .ThenByDescending(x => x)
   .ToList();

我预计 11/09/2022 首先出现。但是,首先出现的是 12/01/2021。任何解决此问题的建议将不胜感激。

您按字符串而不是日期时间排序。 “12”在“11”之后。在发现第二个字符的差异后,不再比较字符串的其余部分(以及月份和年份)。按日期时间排序您的列表:

 var result = dataList
            .OrderByDescending(x => DateTime.TryParseExact(x, "MM/dd/yyyy", System.Globalization.CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime endDate) ? endDate : default(DateTime?))
            .ToList();

在线演示:https://dotnetfiddle.net/G9VvXH

原始代码解析日期但丢弃结果,然后改为按字符串排序。这将通过将有效日期时间放在第一位进行排序,如果有效则按日期时间排序,如果无效则按字符串值排序。请注意,对于无效日期,按字符串排序没有意义,但至少这是确定性的,例如它不会随机对无效字符串进行排序。

var result = dataList
   .Select(x => new { 
       dateString = x,
       valid = DateTime.TryParseExact(x, "MM/dd/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime end),
       endDate = end,
   })
   .OrderBy(x => x.valid ? 0 : 1)
   .ThenByDescending(x => x.endDate)
   .ThenByDescending(x => x.dateString)
   .Select(x => x.dateString)
   .ToList();