0

我有一个包含美国假期日期的列表(日期)。每当某个日期在周末时,它必须移到周五或周一。

我知道我可以使用:

    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;这些对我来说都有些模糊。我有时会使用它们,并试图提高我使用它们的能力。

我可以使用 HolidayList.ForEach 使用内联函数/lambda 增加/减少日期吗?

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) Delegate 和 List(of T).ForEach 的文档,但我无法将它们放在一起。

4

1 回答 1

2

在这种特殊情况下,您将无法使用该List.ForEach方法(或 For Each 循环)执行您想要的操作。问题是您的列表存储日期,它们是值类型。这意味着您将传递给 ForEach 的 Action 的参数(或 For Each 循环的循环变量)是该值的副本,因此任何重新分配的新值都将在委托调用(或循环迭代)结束时丢失)。这使您有两个选择;要么是标准的 For 循环(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都是a ,如果需要IEnumerable(Of Date),您可以将其转换为List(Of Date)with 。ToList()

于 2013-07-09T04:31:00.077 回答