我有以下代碼。查找在另一個字符串列表中有一個項目的子字符串的所有字符串
let s1 = [(12, "abcde12345"); (23, "bcdef2345"); (12, "xyzafg3838")]
let s2 = ["bcd"; "345"]
什麼是找到s1
的所有項目,其第二項在s2
任何一個的子串的最佳方式?
(12,「abcde12345」); (23,「bcdef2345」)
在我的真實代碼s1是Seq
。
我有以下代碼。查找在另一個字符串列表中有一個項目的子字符串的所有字符串
let s1 = [(12, "abcde12345"); (23, "bcdef2345"); (12, "xyzafg3838")]
let s2 = ["bcd"; "345"]
什麼是找到s1
的所有項目,其第二項在s2
任何一個的子串的最佳方式?
(12,「abcde12345」); (23,「bcdef2345」)
在我的真實代碼s1是Seq
。
我想出了一個。
s1 |> Seq.filter (fun i -> List.exists (fun e -> (snd i).Contains(e)) s2)
將第二組中的所有項目都變爲正則表達式,然後將其應用於第一組中的每個項目。
open System
open System.Text.RegularExpressions
let setA = [ "One"; "Two"; "Three" ]
let setB = [ "o"; "n" ];
let pattern = String.Join("|", setB);
let regex = new Regex(pattern);
let results = setA |> List.filter (fun str -> regex.Match(str).Success)
results |> List.iter (fun result -> Console.WriteLine(result))
Seq.filter (fun (_, x) -> List.exists (x.Contains) s2) s1
什麼是做'S1點|>'這裏?爲什麼不'Seq.filter()s1'?你可以使用模式匹配來避免'snd'像'fun(_,x) - > ... x.Contains(e)...'。 –
你可以使它成爲無點'(x.Contains)'而不是'fun e - > x.Contains(e)' –
它的工作方式 – ca9163d9