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

しかし、私は本当にアクション、デリゲート、関数、ラムダを理解しようとしています。これらはすべて、私にはややあいまいです。私は時々それらを使用しており、それらを使用する能力を高めようとしています.

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) Delegate と List(of T).ForEach のドキュメントをチェックアウトしましたが、すべてをまとめることはできませんでした。

4

1 に答える 1

2

List.ForEachこの特定のケースでは、メソッド (または For Each ループ)で必要なことを行うことができません。問題は、リストに値の型である日付が格納されていることです。これは、ForEach (または For Each ループのループ変数) に渡す Action への引数が値のコピーであることを意味します。したがって、再割り当てされた新しい値はデリゲート呼び出し (またはループ反復) の最後に失われます。 )。これには 2 つのオプションがあります。標準の 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))

または、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()

于 2013-07-09T04:31:00.077 に答える