从基于DateTime的列表中删除项目的最佳方法

本文关键字:删除项目 最佳 方法 列表 DateTime | 更新日期: 2023-09-27 18:01:21

我有一个时间戳字符串的System.Collections.Generic.List,看起来像这样:

  • 14-Oct-2013_10.36-34: JobID=1234, Status=FAILED.
  • 14-Nov-2013_11.12-36: JobID=2345, Status=SUCCESS.
  • 10-Dec-2013_14.20-42: JobID=3456, Status=SUCCESS.

等。

(该列表保证是按时间顺序排列的,尽管有奇怪的分隔符,但它读起来像您可能期望的那样,例如Day-Month-Year_24hr。Minutes-Seconds)

我有两个DateTime对象:startDateTime, endDateTime

我想处理这个列表,以便处理后剩下的所有条目的时间戳都在我的两个DateTime对象定义的范围内。

鉴于此,我想我有两个问题:

  1. 如何将"10-Dec-2013_14.20-42"转换为日期时间

  2. 我如何从列表中删除项目,因为我正在运行它?

我想我能应付剩下的过程。

感谢您的帮助。谢谢。

从基于DateTime的列表中删除项目的最佳方法

这将获取字符串的日期部分并使用DateTime.ParseExact 将其转换为有效的DateTime(使用24小时格式,因为字符串中没有am或pm)

结果是一个新列表,其中只有在您的日期范围内的字符串。

var filteredList
    = (from o in originalList
       let dt = DateTime.ParseExact(
                  o.Substring(0, o.IndexOf(":")),
                  "dd-MMM-yyyy_HH.mm-ss", CultureInfo.CurrentCulture)
       where dt >= startDateTime
          && dt <= endDateTime
       select o).ToList();

从原始列表中删除项:

originalList.RemoveAll(
    x => (from o in originalList
          let dt = DateTime.ParseExact(
                     o.Substring(0, o.IndexOf(":")),
                     "dd-MMM-yyyy_HH.mm-ss", CultureInfo.CurrentCulture)
          where dt >= startDateTime
             && dt <= endDateTime
          select o).Contains(x));

注意,如果任何一行的输入不能转换为有效的日期,ParseExact将抛出异常。

使用DateTime.ParseExact()方法解析日期。

如果你有一个通用列表,它有一个适合你需要的方法List<T>.RemoveAll()