在f#中过滤日期数组

时间:2011-05-02 11:48:31

标签: date f# filter

我有一个包含没有周末的日期的数组(不一定是工作日)。现在我只希望每个月只有一个日期,而且仅限某一天。如果数组中不存在该日期,则应在结果列表中显示以下现有日期。

例如: 给定阵列:2010年1月1日,2010年2月2日,2010年5月2日,2010年6月,2010年,2010年1月3日,2010年2月,2010年4月,2010年4月,2010年4月,2010年4月。

我希望每个月2日的所有日期

结果:2010年2月2日,2。3日,2010年4月4日

我如何在F#中做到这一点?请提供一个教育和好的解决方案,我尝试学习F#。我知道如何以命令的方式做到这一点:)

谢谢! :d

2 个答案:

答案 0 :(得分:1)

以下是一种可能的解决方案:

// Your input list with dates
let input = [DateTime.Now]
// We want 2nd day or later
let number = 2

input 
  // First, create group of dates for every Year/Month 
  // (so that all days in specifc month are in a single group)
  |> Seq.groupBy (fun dt -> dt.Year, dt.Month)
  |> Seq.map (fun ((y, m), dates) ->
     // We want only dates that are later (or equal to) this 'limit'
     let limit = new DateTime(y, m, number)
     // Remove dates before the limit and then select minimal date
     dates |> Seq.filter (fun d -> d >= limit) |> Seq.min)

答案 1 :(得分:1)

这是另一个(假设已排序的输入):

type DateTime = System.DateTime

let filterDayOrFollowing day (input:DateTime[]) =
    (input, ([], None))
    ||> Array.foldBack (fun date (acc, following:DateTime option) ->
        if date.Day = day then date::acc, None
        else match following with
             | Some f when date.Year = f.Year
                        && date.Month = f.Month
                        && date.Day < day -> f::acc, None
             | _ -> acc, Some date)
    |> fst

let expected = [ DateTime(2010, 2, 2)
                 DateTime(2010, 3, 2)
                 DateTime(2010, 4, 4) ]

let actual =
    [| DateTime(2010, 2, 1)
       DateTime(2010, 2, 2)
       DateTime(2010, 2, 5)
       DateTime(2010, 2, 6)
       DateTime(2010, 3, 1)
       DateTime(2010, 3, 2)
       DateTime(2010, 4, 1)
       DateTime(2010, 4, 4) |]
    |> filterDayOrFollowing 2

actual = expected |> printfn "actual = expected: %b"