我有一个(日期)列表,其中包含美国假期的日期。每当一个日期在周末,它必须被移动到周五或周一。
我知道我可以使用:
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的文档,但我还是没能把它们放在一起。
答案 0 :(得分:2)
在这种特殊情况下,您将无法使用List.ForEach
方法(或For Each循环)执行所需操作。问题是您的列表存储日期,这是值类型。这意味着您将传递给ForEach的Action的参数(或For Each循环的循环变量)是值的副本,因此重新分配的任何新值将在委托调用结束时丢失(或循环迭代) )。这有两个选择;要么是标准的For循环(对于i = 0到HolidayList.Count - 1),那么你可以将其分配回循环中的列表,或者你可以在不修改旧列表的情况下构建新的列表。 (如果需要,您可以完全替换旧列表。)后一个选项可能类似于:
Dim allWeekday = From h in HolidayList
Select If(h.DayOfWeek = DayOfWeek.Saturday,
h.AddDays(-1),
If(h.DayOfWeek = DayOfWeek.Sunday,
h.AddDays(1),
h))
或使用delgate语法而不是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()
。