按日期拆分列表

时间:2015-03-03 17:58:18

标签: vb.net

我正试图找出一种方法来拆分包含日期的列表。我将尽可能简单地尝试解释。

enter image description here

因此,在上图中,列表1是原始列表,列表2是新列表。但是,新列表可以是此网格中7天的任何其他选择。

结果将是2个新列表或3个新列表。 2如果新列表开始或完成原始列表。 3如果碰巧像图片中那样拆分它。

就上图而言,结果将是;

  • 清单1:1月2日至1月2日
  • 清单2:1月3日至1月5日
  • 清单3:1月6日至6月6日

提前致谢。

1 个答案:

答案 0 :(得分:1)

我使用私有枚举来完成这项工作,以跟踪两个列表的匹配日期之间的状态:

Private Enum DateStatus
  NoMatching
  OneMatching
  AllMatching
End Enum

Private Function SplitDates(listOne As IEnumerable(Of Date), _
                            listTwo As IEnumerable(Of Date)) _
                          As IEnumerable(Of IEnumerable(Of Date))
  Dim results As New List(Of List(Of Date))
  Dim listStatus As DateStatus = DateStatus.NoMatching

  Dim startDate As New Date(Math.Min(listOne.First.Ticks, listTwo.First.Ticks))
  Dim finalDate As New Date(Math.Max(listOne.Last.Ticks, listTwo.Last.Ticks))
  Dim curDate As Date = startDate
  While curDate <= finalDate
    If listOne.Contains(curDate) And listTwo.Contains(curDate) Then
      If listStatus <> DateStatus.AllMatching Then
        listStatus = DateStatus.AllMatching
        results.Add(New List(Of Date))
      End If
    ElseIf Not listOne.Contains(curDate) And Not listTwo.Contains(curDate) Then
      listStatus = DateStatus.NoMatching
    Else
      If listStatus <> DateStatus.OneMatching Then
        listStatus = DateStatus.OneMatching
        results.Add(New List(Of Date))
      End If
    End If
    If listStatus <> DateStatus.NoMatching Then
      results.Last.Add(curDate)
    End If
    curDate = curDate.AddDays(1)
  End While
  Return results
End Function