另一个例子递归函数来实现(可能不是那么简单和其他一样快,但用不同的方法制造):
let rec find (b: 'T list) (a: 'T) : bool * 'T list =
match b with
| [] -> false, b
| h :: t ->
if h = a then
true, t
else
let res, restB = a |> find t
res, h :: restB
let rec merge (a: 'T list) (b: 'T list) (order: bool) : ('T * bool * bool) list =
match a with
| [] ->
if not(order) then
[]
else
merge b a false
| h :: t ->
let resA, newB = h |> find b
(h, resA || order, resA || not(order)) :: merge t newB order
let Merge (a: 'T list) (b: 'T list) : ('T * bool * bool) list =
merge a b true
而且为:
let dtl1 =
[DateTime.Today.AddDays(1.)
DateTime.Today.AddDays(2.)
DateTime.Today.AddDays(3.)
DateTime.Today.AddDays(4.)
DateTime.Today.AddDays(5.)
DateTime.Today.AddDays(6.)]
let dtl2 =
[DateTime.Today.AddDays(4.)
DateTime.Today.AddDays(5.)
DateTime.Today.AddDays(6.)
DateTime.Today.AddDays(7.)
DateTime.Today.AddDays(8.)
DateTime.Today.AddDays(9.)]
Merge dtl1 dtl2
给出:
[(27.11.2011 0:00:00, true, false); (28.11.2011 0:00:00, true, false);
(29.11.2011 0:00:00, true, false); (30.11.2011 0:00:00, true, true);
(01.12.2011 0:00:00, true, true); (02.12.2011 0:00:00, true, true);
(03.12.2011 0:00:00, false, true); (04.12.2011 0:00:00, false, true);
(05.12.2011 0:00:00, false, true)]
更新:合并功能进行了简化,使类似其他答案结果
您可以直接生成使用方名单DateTime是否顺序括号而不是seq {}。 – gradbot
@gradbot - 谢谢,我通过你的建议 –
+1,而你的代码比李的更复杂,它的速度更快。你的是n log m + m log n + n log n + m log m而Lee's是(n + m)log m +(n + m)log n。 – gradbot