2010-09-15 39 views
5

Tôi đang cố gắng để viết một hàm mà tạo ra một danh sách các DateTimes sử dụng cú pháp máy phát điện:Máy phát điện F # của daterange?

let dateRange = 

    let endDate = System.DateTime.Parse("6/1/2010") 
    let startDate = System.DateTime.Parse("3/1/2010") 

    seq { 
      for date in startDate..endDate do 
       if MyDateClass.IsBusinessDay(date) then yield date 
     } 

nhưng các máy phát điện ('seq') khối không phân tích một cách chính xác. Nó muốn một khoảng thời gian. Trong khi cú pháp máy phát điện có vẻ hoàn hảo cho những gì tôi muốn làm, nó thay vì không trực quan cho bất cứ điều gì nhưng hai con số.

  1. Có thể sử dụng cú pháp trình tạo để tạo phạm vi ngày giờ không?
  2. là có một cách tốt hơn để suy nghĩ về làm thế nào để tạo khoảng hơn tôi đã viết (tức là 'trong' khoản)
+0

Định dạng ngày của bạn khiến tôi không đọc được phần còn lại của câu hỏi này. Nghiêm túc, mắt tôi đang tưới nước. – Kendrick

+0

Tôi không hiểu lắm. Vấn đề với định dạng ngày tháng là gì? –

Trả lời

5

Sự khác biệt arithemetic giữa hai đối tượng DateTime trong .NET luôn luôn là một TimeSpan , đó là vấn đề đầu tiên của bạn. Và nếu bạn có một TimeSpan, nó sẽ không thực hiện IEnumerable <>, vì vậy không thể được sử dụng như một chuỗi. Bạn có thể viết biểu hiện chuỗi riêng của bạn, mặc dù:

let rec dates (fromDate:System.DateTime) (toDate:System.DateTime) = seq { 
      if fromDate <= toDate then 
       yield fromDate 
       yield! dates (fromDate.AddDays(1.0)) toDate 
      } 

Bạn sử dụng nó để tạo ra một chuỗi với tất cả các ngày trong phạm vi, và sau đó lọc kết quả:

let result = dates startDate endDate |> Seq.filter (fun dt -> IsBusinessDate(dt)) 
11

Nếu TimeSpan đã có một tĩnh Zero tài sản, sau đó bạn có thể làm một cái gì đó như startDate .. TimeSpan(1,0,0,0) .. endDate. Mặc dù không, bạn có thể tạo trình bao bọc sẽ thực hiện tương tự:

open System 

type TimeSpanWrapper = { timeSpan : TimeSpan } with 
    static member (+)(d:DateTime, tw) = d + tw.timeSpan 
    static member Zero = { timeSpan = TimeSpan(0L) } 

let dateRange = 
    let endDate = System.DateTime.Parse("6/1/2010") 
    let startDate = System.DateTime.Parse("5/1/2010") 
    let oneDay = { timeSpan = System.TimeSpan(1,0,0,0) } 

    seq { 
      for date in startDate .. oneDay .. endDate do 
      if MyDateClass.IsBusinessDay(date) then yield date 
     } 
Các vấn đề liên quan