我正在尝试列出所有星期一和他们的日期,比方说,2014年。我不知道下面的代码有什么问题(可能是循环)。当我执行这些程序时,程序崩溃。
Dim d1 As DateTime = #1/1/2014#
Dim d2 As DateTime = d1.AddDays(-(d1.DayOfWeek - DayOfWeek.Monday))
Do
ListBox1.Items.Add(d2.ToString("MMM - dd - yyyy ddd"))
d2.AddDays(7)
Loop While (d2.Year < 2015)
答案 0 :(得分:5)
DateTime
实例是不可变的,这意味着它无法更改。 d2.AddDays(7)
表达式会创建一个具有不同值的 new 实例,您可以将其分配回d2
:
d2 = d2.AddDays(7)
那为什么你的程序会崩溃?由于日期永远不会改变,因此它永远不会达到2015年,并且您的程序将尝试向列表框添加无限多个项目。显然,在发生这种情况之前你会耗尽内存,这会导致程序崩溃。
答案 1 :(得分:1)
您需要将AddDays中的值重新分配给用于测试存在条件的变量
d2 = d2.AddDays(7)
如果没有这个,循环永远不会结束,因为永远不会满足退出条件。
返回一个新的DateTime,它将指定的天数添加到 此实例的值
顺便说一句,您的代码还列出了2013年的日期,我建议首先将初始值设置为
Dim d1 As DateTime = #1/7/2014#
答案 2 :(得分:1)
这是一个可能适合您的方法:
Private Function GetAllWeekdays(inYear As Integer, dayOfWeek As System.DayOfWeek) As List(Of Date)
Dim currDate As New Date(inYear, 1, 1) 'start jan 1st
GetAllWeekdays = New List(Of Date)
For i = 1 To (New Date(inYear, 12, 31) - New Date(inYear, 1, 1)).Days
currDate = currDate.AddDays(1)
If (currDate.DayOfWeek = dayOfWeek) Then GetAllWeekdays.Add(currDate)
Next
End Function
它会循环显示所提供年份中的所有日期,并仅返回您提供的System.DayOfWeek
天数。
你可以像这样使用它:
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
Me.ListBox1.DataSource = GetAllWeekdays(2014, DayOfWeek.Monday)
End Sub
答案 3 :(得分:1)
使用迭代器块怎么样?
Private Iterator Function DateSequence( _
start As DateTime, _
step As TimeSpan) As IEnumerable(Of DateTime)
While True
start = start.Add(step)
Yield start
End While
End Function
允许你做一些linq,
Dim firstDay = 'excercise for reader
Dim step = TimeSpan.FromDays(7)
var days = DateSequence(firstDay, step).Take(53) _
.Where(Function(d) d.Year = firstDay.Year)