我对函数式编程相当新颖,并且在列表处理任务时遇到了一些问题。我有类似下面记录的集合:F#:成对减少/聚合一个序列或列表
type TestRec = {
Id : string
Amount : int }
现在我想删除列表中的该相互建立一个对所有项目。例如,如果有Amount
7
和-7
两个项目项目应从列表中删除。如果有第三个元素Amount = 7
它应该留在列表中。
我希望你们能理解我想要做的事情。这是我想出了这么远(但它不正常工作尚未):
let removeDoubles items =
items
|> Seq.groupBy (fun i -> Math.Abs(i.Amount))
|> Seq.map snd
|> Seq.filter (fun i -> Seq.length i = 1)
编辑: ,决定是否两个元素互相一致,可能会比上述更复杂的功能( Math.Abs
)。我认为这将是Amount
值的一个很好的例子,但它可以是任何谓词函数。
编辑2: 为了澄清更多我想给一个可能相关的问题更现实的描述。您可以想象发票的计算,其中列表包含所有发票头寸。现在,您要删除所有具有相同“商品编号”,“货币”和价格评估为零的发票头寸对。
也许这个例子有助于解释我的问题。我只是认为,解决这个问题可能有一种更“功能性的方式”,而不是像在命令式语言中那样使用两个循环遍历列表并删除元素。
所以你基本上要一个新的列表/顺序背,其中汇总每个ID的金额,如果完全删除0项? – Orbling
@Orbling不,不完全是我想的。你必须忘记'Id'。该字段只是任何可能成为记录一部分的任意数据的占位符。我基本上想要搜索应该从列表中删除的元素对。 – kongo2002
所以你只需要找到在列表中大小匹配的整数,但是在符号上有所不同 - 然后将其删除? – Orbling