Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 过滤两个列表f#_List_Recursion_Filter_F# - Fatal编程技术网

List 过滤两个列表f#

List 过滤两个列表f#,list,recursion,filter,f#,List,Recursion,Filter,F#,我有两个字符串列表,一个包含满足某些条件的HumanID(humanosPosibles),另一个列表包含可能满足或不满足这些条件的HumanID(likesTodo)。问题是,我需要创建一个列表,其中只包含likesTodo中的HumanSID以及humanosPosibles中的HumanSID。我试着用递归和list.filter来实现它。我会把我的代码给你看看我做错了什么。如果你认为这不是最好的方法,请提出建议 let rec pasa (likesTodo:string list)

我有两个字符串列表,一个包含满足某些条件的HumanID(humanosPosibles),另一个列表包含可能满足或不满足这些条件的HumanID(likesTodo)。问题是,我需要创建一个列表,其中只包含likesTodo中的HumanSID以及humanosPosibles中的HumanSID。我试着用递归和list.filter来实现它。我会把我的代码给你看看我做错了什么。如果你认为这不是最好的方法,请提出建议

  let rec pasa (likesTodo:string list) (humanosPosibles:string list) x y =
        if (y < humanosPosibles.Length) then
            if (likesTodo.[x] = humanosPosibles.[y]) then
                true 
            else
                pasa likesTodo humanosPosibles x (y+1)  
        else
            false  

 let genteFiltrada = List.filter (fun x -> pasa likesTodo humanosPosibles 0 0 ) likesTodo
让rec pasa(likesTodo:string list)(humanosPosibles:string list)x y=
如果(ypasa likesTodo humanosPosibles 0)likesTodo

genteFiltrada对应于我需要创建的列表。上一次我忘了说,如果有一项likesTodo重复,我需要它在新列表中出现两次。因此,set不起作用

这里是一个使用set的解决方案,因为您需要的是交点:

let intersectlists a b = 
    let la,lb = Set.ofList a, Set.ofList b
    Set.intersect la lb |> Set.toList

可以稍微短一点:
让IntersectList a b=(Set.ofList a,Set.ofList b)| |>Set.intersect |>Set.toList.toList
我有一个问题,如果列表中的一个项目像Estodo重复了好几次,并且它也在humanosPosibles列表中找到,它将被添加一次,或者多次添加到新列表?@Tomas—
set
的工作方式,它将为您删除重复项。@JohnPalmer如果我需要重复项,该怎么办!哈哈