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

时间:2014-05-01 11:35:10

标签: c# list datetime

我有一个带有时间戳字符串的System.Collections.Generic.List,如下所示:

  • 14-Oct-2013_10.36-34:JobID = 1234,Status = FAILED。
  • 14-Nov-2013_11.12-36:JobID = 2345,状态=成功。
  • 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"进入DateTime

  2. 如何在列表中删除项目?

  3. 我想我可以管理剩下的过程。

    感谢所有帮助。感谢。

2 个答案:

答案 0 :(得分:3)

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

结果是一个新列表,其中只包含日期范围之间的字符串。

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将抛出异常。

答案 1 :(得分:1)

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

如果您有通用列表,则它有一个方法List<T>.RemoveAll(),可以满足您的需求。