使用可能的 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();
原始代码解析日期但丢弃结果,然后改为按字符串排序。这将通过将有效日期时间放在第一位进行排序,如果有效则按日期时间排序,如果无效则按字符串值排序。请注意,对于无效日期,按字符串排序没有意义,但至少这是确定性的,例如它不会随机对无效字符串进行排序。
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();
我正在尝试使用 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();
原始代码解析日期但丢弃结果,然后改为按字符串排序。这将通过将有效日期时间放在第一位进行排序,如果有效则按日期时间排序,如果无效则按字符串值排序。请注意,对于无效日期,按字符串排序没有意义,但至少这是确定性的,例如它不会随机对无效字符串进行排序。
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();