使用以下(或類似的DateRange
類)。
Class DateRange
Implements IEnumerable(Of DateTime)
Public Sub New(startDate As DateTime, endDate As DateTime)
me.StartDate = startDate
me.EndDate = endDate
End Sub
Public ReadOnly Property StartDate() As DateTime
Public ReadOnly Property EndDate() As DateTime
Public Function GetEnumerator() As IEnumerator(Of DateTime) Implements IEnumerable(of DateTime).GetEnumerator
Return Enumerable.Range(0, 1 + EndDate.Subtract(StartDate).Days).[Select](Function(offset) StartDate.AddDays(offset)).GetEnumerator()
End Function
Private Function IEnumerable_GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator
Return GetEnumerator()
End Function
End Class
這個類的重要部分是它是可枚舉的。也就是說,它返回開始日期和結束日期之間的日期序列(包括在for each
循環中使用)。
然後你可以用這樣的代碼來得到你想要的東西:
Dim ranges = New List(Of DateRange)()
ranges.Add(New DateRange(#2017/1/1#,#2017/1/10#))
ranges.Add(New DateRange(#2017/1/8#,#2017/1/20#))
Dim merged = ranges.SelectMany(Function(r) r.AsEnumerable()).Distinct().OrderBy(Function(dt) dt)
Console.WriteLine($"{merged.Count()} days: ")
For Each [date] As DateTime In merged
Console.WriteLine([date].ToShortDateString())
Next
Console.ReadLine()
這使用LINQ SelectMany
功能,所有在該DateRange
實例壓扁日期的列表(由IEnuemrable
DateRange
創建)列表到DateTime
的單個列表。然後它獲取不同的(唯一的)值,並對列表進行排序。
輸出顯示來自包含2個實例的列表的輸出。第一個是2017年1月1日至2017年1月10日,第二個是2017年1月8日至2017年1月20日。這些範圍在第8,9和10日重疊。如您所見,這些重疊日期只包含一次。
以下輸出產生:
20天:
2017年1月1日
2017年1月2日
2017年1月3日
2017年1月4日
1 /二千○十七分之五
2017年1月6日
2017年1月7日
2017年1月8日
2017年1月9日
2017年1月10日
2017年1月11日
2017年1月12日
2017年1月13日
2017年1月14日
2017年1月15日
2017年1月16日
2017年1月17日
2017年1月18日
2017年1月19日
二零一七年一月二十零日
當你迭代時,你可以把重疊的日期放在列表或字典中,這樣你就知道哪些已經被計數了 – Plutonix
我會先得到一個沒有重疊的範圍列表。在其他列表中循環併合並重疊範圍。然後你可以得到天數。 –