F#C#类的所有置换

F#C#类的所有置换,f#,permutation,F#,Permutation,我的班级有一个C班 我需要实现f#方法返回所有 IList中项目的可能排列 问题是MyClass包含一个方法 如果 MyClass的实例可以放在实例之后的排列中 参数中MyClass的。否则,此方法返回false 请问,谁能告诉我如何实现正确的F#功能 更新: 请考虑到我的C#类有方法:bool CheckOrder(IList前辈)你的CheckOrder方法需要一个IList,所以我们可能应该在F#中使用数组,因为数组实现了IList接口 对于置换候选中的每个元素,我们需要检查其在数组中的所

我的班级有一个C班

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

问题是MyClass包含一个方法 如果 MyClass的实例可以放在实例之后的排列中 参数中MyClass的。否则,此方法返回false

请问,谁能告诉我如何实现正确的F#功能

更新:
请考虑到我的C#类有方法:bool CheckOrder(IList前辈)

你的
CheckOrder
方法需要一个
IList
,所以我们可能应该在F#中使用数组,因为数组实现了
IList
接口

对于置换候选中的每个元素,我们需要检查其在数组中的所有前置元素是否合法。对我来说,这看起来像是一个
fold
操作的作业,其中
fold
的状态参数是“array至今”的元组和布尔成功标志

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
可能效率很低。如果这太慢了,你应该考虑使用<代码> RsiZeRay.<代码>(与C代码<代码>列表>代码>相同。另一个:使用这个接口,唯一的解决方案似乎是“生成并测试”,即创建所有排列,然后过滤它们。这对于大型列表可能是不切实际的。通过更明确地表示排序约束,应该可以使用调度和约束编程的技术实现高效的实现。也许看看微软解决方案基金会。