我有兩個串列。第一個是具有Id屬性的結構化記錄的串列,其中Id是一個字串封裝器。第二個是一個簡單的字串串列。
我需要找到第一個串列中的所有記錄,這些記錄的 Id 在第二個串列中得到了體現。
在c#中,這將是微不足道的:
var intersect = list1.Where(x => list2. Contains(x.Id.ToString())
也許有更有效的方法來獲得交集,但c#與linq使它很容易獲得所需的輸出。
。我對f#比較陌生,但在f#中這似乎是一個非簡單的操作。f# 中的 Linq 不支持 lambda 比較器函式(據我所知),并且內置的過濾器函式似乎依賴于兩個串列中的物體之間的直接比較(不容易指定一個自定義比較器)。
我已經嘗試了以下方法:
list1 |> List.filter(fun x -> List. contains (x.Id.ToString() list2)
......但這給出了以下編譯器錯誤:
This expression was expected to have type
'bool'。
但這里有type
''a list -> bool'
我真的希望有人能告訴我,我太笨了,有一個非常簡單的方法可以在f#中做到這一點......請!
ANSWER
ANSWER 事實證明,我弄亂了我的語法。我認為下面的小括號是必須的,以迫使x.Id.ToString()首先被評估,但List.contains的引數周圍的小括號不是必須的 uj5u.com熱心網友回復: 在F#中,函式引數由空格分隔,而不是逗號,每個引數周圍的小括號是可選的。你沒有在整個引數串列中使用小括號--那將表示一個元組。
你寫的是: 但是你可能是指這個: 完整的例子(放在一個
標籤: 下一篇:用c#搜索txt檔案中的字串
List1 |> List.filter(fun x -> List. contains (x.Id.ToString()) list2)
list1 |> List.filter(fun x -> List. contains (x.Id.ToString(), list2)
list1 |> List.filter (fun x -> List. contains (x.Id.ToString()) list2)
.fsx檔案中):type Foo =
{
Id : string
}
let list1 = { Id : string }
[
{ Id = "a"/span> }
{ Id = "b" }
{ Id = "x" }
]
let list2 =
[
"a"
"b"/span>
"c"/span>
]
let list3 =
list1 |> List.filter (fun x -> List. contains (x.Id.ToString()) list2)
printfn "%A"/span> list3
// [{ Id = "a"/span> }; { Id = "b"/span> }]
