如何对从可空日期时间转换的字符串列表进行排序

本文关键字:字符串 列表 排序 转换 时间 日期 | 更新日期: 2023-09-27 18:03:07

我有一个从可空DateTime对象创建的字符串列表。空字符串表示空条目。所以列表可以像

{ "23.06.2015", "", "01.07.2014", "" }

我想按日期降序排序。空字符串应该在底部

.OrderByDescending(o => o.DateString)

排序错误。我想使用

.OrderByDescending(o => DateTime.Parse(o.DateString))

但是对于空字符串会抛出异常

如何对从可空日期时间转换的字符串列表进行排序

您可以将日期格式设置为yyyymmdd而不是dd.mm.yyyy吗?如果可以,那么在排序时它们将以数字(也包括日期)顺序显示。

一旦排序,您可以将它们转换回原来的dd.mm.yyyy格式

这对我有用:

var source = new [] { "23.06.2015", "", "01.07.2014", "" };
Func<string, DateTime?> parse = s =>
{
    DateTime result;
    if (DateTime.TryParseExact(
        s,
        "dd.MM.yyyy",
        System.Globalization.CultureInfo.CurrentCulture,
        System.Globalization.DateTimeStyles.AssumeLocal,
        out result))
    {
        return result;
    }
    return null;
};
var query =
    from s in source
    orderby parse(s) descending
    select s;
我得到的结果是:
"23.06.2015",
"01.07.2014",
"",
"",

当然,你也可以这样做:

var query = source.OrderByDescending(s => parse(s));

您是否能够先将输入排序为Nullable<DateTime>,然后将它们转换为string ?

var inputDates = new List<DateTime?>() { new DateTime(2015,6,23), null, new DateTime(2014, 07, 1), null };
var sortedDateStrings = inputDates.OrderByDescending(d => d).Select(d => d.HasValue ? d.Value.ToString("dd.MM.yyyy"): string.Empty);