我對函數式編程相當新穎,並且在列表處理任務時遇到了一些問題。我有類似下面記錄的集合: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