F# C# 类的所有排列

发布于 2024-10-30 17:58:11 字数 300 浏览 3 评论 0原文

我有一个 C# 类 MyClass。

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

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

请有人告诉我如何实现正确的 F# 函数。

更新: 请您概述一下方法测试的 F# 代码,考虑到我的 C# 类具有方法: bool CheckOrder(IList 前辈)

I have a C# class MyClass.

And I would need to implement f# method returning all
possible permutations of items in a IList

Problem is that MyClass contains a method
bool CheckOrder(IList predecessors) returning true if the
instance of MyClass can be placed in the permutation after instances
of MyClass in the parameter. Otherwisem this method returns false.

Please, could anyone advise me how to implement a proper F# function.

Update:
Please, could you outline F# code of the method test considering my C# class having method: bool CheckOrder(IList predecessors)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

暗地喜欢 2024-11-06 17:58:11

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

对于排列候选中的每个元素,我们需要检查其在数组中的所有前驱元素是否合法。对我来说,这看起来像是折叠操作的工作,其中折叠的状态参数是“到目前为止的数组”的元组和布尔成功标志。

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 相同)。

Your CheckOrder method expects an IList<MyClass>, so we should maybe work with arrays in F#, since arrays implement the IList interface.

For every element in a permutation candidate, we need to check whether all its predecessors in the array are legal. To me, that looks like a job for a fold operation where the fold's state parameter is a tuple of the "array so far" and a boolean success flag.

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 is probably quite inefficient. If this is too slow, you should consider using a ResizeArray (which is the same as a C# List) instead.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文