【问题标题】:Remove item from Array, with item that doesn't provide equality从数组中删除项目,项目不提供相等性
【发布时间】:2016-05-09 03:34:47
【问题描述】:

如果数组不相等,我如何从数组中删除一项?

例如,对于具有相等性的项目,我可以执行以下操作:

Array.filter (fun x -> x <> itemToRemove) array

不幸的是,这不起作用,因为在我的情况下,我有一个元组,其中第三项是一个柯里化函数(我稍后会提供最后一个参数),而这不具有相等性。

编辑:

这是我遇到问题的确切示例:

let arrayWithoutReq = Array.filter (fun (req:(string * Port<'a> * ('a -> bool) option * int * DateTime)) -> req <> fullfilableReq) (originalFifoRequests.toArray())

【问题讨论】:

  • 你能展示 MCVE 吗?
  • 这完全取决于你的平等规则是什么。您是在谈论身份(完全相同的对象)还是值比较(两个不同的对象但在语义上表示相同的值)
  • @FoggyFinder 添加了我遇到问题的代码
  • 太棒了,现在告诉我你有什么以及你最终想要得到什么。
  • 虽然这可以完成,如答案所示,但这并不意味着它应该在这里完成。说真的,看看那个元组类型!它需要引用相等吗?只需为它定义一个类型!有一个 [&lt;ReferenceEquality&gt;] 属性适用于记录和联合。

标签: .net arrays f#


【解决方案1】:

既然您在谈论身份比较,请使用内置参考比较

let arrayWithoutReq = 
    originalFifoRequests
    |> Seq.filter (fun req -> 
           Object.ReferenceEquals(req, fullfilableReq) |> not)
    |> Seq.toArry

【讨论】:

  • 谢谢,似乎有效 :) 在我的情况下,我不需要 seq 到数组部分,但 Object.ReferenceEquals 有效!
  • @Choub890 很酷,它可以工作。 Seq.ToArray 只是与原始代码相提并论,如果您不需要数组,您当然不应该像我上面所做的那样创建一个数组
猜你喜欢
  • 2021-05-28
  • 2021-10-19
  • 1970-01-01
  • 2021-10-03
  • 2014-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多