从日期列表中查找最小日期值

Posted

技术标签:

【中文标题】从日期列表中查找最小日期值【英文标题】:Finding the minimum date value from a list of dates 【发布时间】:2019-06-21 18:48:48 【问题描述】:

这将为我提供我的开始日期列表:(它们存储为 STRING

var startDate = myValues.Select(t => t.StartDate).ToList();

我只需要它从中选择最早的日期值。如果它是一个空字符串,那么这也是赢家,如果没有空字符串,那么只看哪个是真正最早的。

有没有办法我可以使用LINQ结合这部分和我上面的部分来一次找到它?而不是单独编写更多逻辑来从该列表中找到最小日期?

【问题讨论】:

如果您知道它们可以解析为DateTime,您可以使用静态Parse 方法将每个项目转换为DateTime,然后选择Min 值:@987654327 @ 我认为 DateTime.Parse 不适用于空字符串?您可能必须将自定义比较器传递给 Min 方法,该方法检查字符串是否为空/空,否则它调用 DateTime.Parse 方法 新的 DateTime 将给出最小日期 (1/1/01)。所以请尝试以下操作: DateTime startDate = myValues.Select(t => (t.StartDate == string.Empty) ? new DateTime() : DateTime.Parse(t.StartDate)).Min(t => t.StartDate); 如果值不为空或不是有效的DateTime 对象怎么办?你只是想选择第一个,返回null,还是抛出异常(或其他)? 【参考方案1】:

类似:

string winner = myValues.Select(t => t.StartDate)
    .Select(s => new str = s, date = DateTime.TryParse(s, out DateTime dt) ? dt : new DateTime?() )
    .OrderByDescending(x => String.IsNullOrEmpty(x.str))
    .ThenByDescending(x => x.date.HasValue)
    .ThenBy(x => x.date.GetValueOrDefault())
    .Select(x => x.str)
    .First();

【讨论】:

如果字符串为空或有效字符串,那么简单的 Min 也可以工作,并且在 Min 检查空/空字符串时返回 DateTime.MinValue.Ticks 否则返回 DateTime.Parse (string).Ticks 我认为您在某些地方缺少.StartDate...TryParsestring 作为第一个参数(IsNullOrEmpty 也是如此),而Select 应该选择string @RufusL 你是对的 :) 当然他需要先选择 SartDate 属性【参考方案2】:

这可能对你有帮助

var result = myValues?.Where(t=>!string.IsNullOrEmpty(t.StartDate))?.
  Select(t =>  DateTime.TryParse(t.StartDate, out DateTime date); return date;)?.
  Min();

【讨论】:

以上是关于从日期列表中查找最小日期值的主要内容,如果未能解决你的问题,请参考以下文章

在最接近指定日期的列表中查找上一个日期

多个条件查找最小和最大日期值

在 Excel 中查找符合条件的数据,查找最小日期,返回第三个值

在包含多个开始和日期列表的表中查找日期,如果找到则返回默认值

查找两个日期的最小值/最大值(键入)

从 pandas 的时间序列范围中查找最小和最大日期