F#C#类的所有排列

时间:2011-04-07 16:47:37

标签: f# permutation

我有一个C#类MyClass。

我需要实现f#方法返回all IList中项目的可能排列

问题是MyClass包含一个方法 bool CheckOrder(IList前辈)返回true如果 MyClass的实例可以放在实例后的排列中 参数中的MyClass。否则此方法返回false。

拜托,有没有人可以告诉我如何实现正确的F#功能。

更新的 请问,考虑到我的C#类有方法,你能概述方法测试的F#代码:bool CheckOrder(IList前身)

1 个答案:

答案 0 :(得分:0)

您的CheckOrder方法需要IList<MyClass>,因此我们应该使用F#中的数组,因为数组实现了IList接口。

对于置换候选中的每个元素,我们需要检查数组中的所有前导是否合法。对我来说,这似乎是fold操作的工作,其中fold的状态参数是“到目前为止的数组”的元组和布尔成功标志。

let checkPermutation (permutation:MyClass[]) =
   let prefix, success =
      permutation
      |> Array.fold (fun (prefix:MyClass[], success) element ->
                        if not success then
                           (Array.empty, false) // once failed, the result is false
                        else
                           (Array.append [|element|] prefix, element.CheckOrder prefix)
                    )
                    (Array.empty, true)
   success

Array.append可能效率很低。如果这太慢,您应该考虑使用ResizeArray(与C#List相同)。