我有一个清单(日期),上面有美国假期的日期。每当日期在周末时,都必须将其移至星期五或星期一。
我知道我可以使用:
For i As Integer = 0 To HolidayList.Count - 1
Dim dt As Date = HolidayList(i)
If dt.DayOfWeek = DayOfWeek.Saturday Then
HolidayList(i) = dt.AddDays(-1)
End If
If dt.DayOfWeek = DayOfWeek.Sunday Then
HolidayList(i) = dt.AddDays(1)
End If
Next
但是,我实际上是在尝试了解动作,委托,函数和lambda。这些对我来说都有些模糊。我有时使用它们,并试图提高使用它们的能力。
我可以使用内联函数/ lambda使用HolidayList.ForEach来增加/减少日期吗?
Dim HolidayList As New List(Of Date)
'I have a function that creates a list of current year's holidays based on the rules
HolidayList.Add("1/1/2013")
HolidayList.Add("7/4/2013")
HolidayList.Add("12/25/2013")
'saturday holidays are moved to Fri; Sun to Mon
'something like this
'HolidayList.ForEach(action as system.action(of Date))
'HolidayList.ForEach(func(if dt.DayOfWeek = DayOfWeek.Saturday then dt = dt.AddDays(-1)))
编辑:我已经签出了Action(Of T)委托和List(of T).ForEach的文档,但是我无法将它们放在一起。
在这种特殊情况下,您将无法使用该List.ForEach
方法(或任一For Each循环)执行所需的操作。问题在于您的列表存储的是日期类型,即值类型。这意味着您将传递给ForEach的Action的参数(或For Each循环的循环变量)是值的副本,因此在委托调用(或循环迭代)结束时丢失的任何新值都会丢失)。这给您两个选择。或者是标准的For循环(对于HolidayList.Count-1,i = 0),以便可以将其分配回循环中的列表,也可以在不修改旧列表的情况下构建新列表。(然后,可以根据需要完全替换旧列表。)后一个选项可能类似于:
Dim allWeekday = From h in HolidayList
Select If(h.DayOfWeek = DayOfWeek.Saturday,
h.AddDays(-1),
If(h.DayOfWeek = DayOfWeek.Sunday,
h.AddDays(1),
h))
或使用替代语法而不是LINQ:
Dim allWeekday = HolidayList.Select(
Function (h)
If h.DayOfWeek = DayOfWeek.Saturday Then
Return h.AddDays(-1)
Else If h.DayOfWeek = DayOfWeek.Sunday Then
Return h.AddDays(1)
Else
Return h
End If
End Function)
在这两个版本,allWeekday
是IEnumerable(Of Date)
,你可以转换为List(Of Date)
与ToList()
如果需要的话。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句