Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.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
F# 用F“帮助:”;“收藏已修改”;_F# - Fatal编程技术网

F# 用F“帮助:”;“收藏已修改”;

F# 用F“帮助:”;“收藏已修改”;,f#,F#,我对F#非常陌生,在这里,我遇到了F#中的“集合被修改”问题。我知道当我们在修改(添加/删除)集合的同时遍历集合时,这个问题很常见。stackoverflow中以前的线程也指出了这一点 但就我而言,我正在处理两个不同的集合: 我有两个收藏: originalCollection我想从中删除内容的原始集合 colToRemove包含要删除的对象的集合 代码如下: Seq.iter ( fun input -> ignore <| originalCollection.Remo

我对F#非常陌生,在这里,我遇到了F#中的“集合被修改”问题。我知道当我们在修改(添加/删除)集合的同时遍历集合时,这个问题很常见。stackoverflow中以前的线程也指出了这一点

但就我而言,我正在处理两个不同的集合: 我有两个收藏:

  • originalCollection我想从中删除内容的原始集合
  • colToRemove包含要删除的对象的集合
代码如下:

   Seq.iter ( fun input -> ignore <| originalCollection.Remove(input)) colToRemove
谢谢


注意:此处使用单线程环境,因此不存在可能导致此异常的多线程问题。

此处的问题是
colToRemove
不是独立的集合,而是集合
原始集合的投影。因此,更改原始集合将更改迭代期间不允许的投影。上述代码的C#等价物如下

var colToRemove = originalCollection
  .Where(input -> newCollection.Any(i -> i.id == input.id));
foreach (var in input in colToRemove) {
  originalCollection.Remove(input);
}
您可以通过
List.ofSeq
方法使
colToRemove
成为一个独立的集合来解决此问题

 let colToRemove = 
   originalCollection
   |> Seq.filter (fun input -> Seq.exists (fun i -> i.id = input.id) newCollection) originalCollection
   |> List.ofSeq

这里的问题是
colToRemove
不是一个独立的集合,而是集合
originalCollection
的投影。因此,更改原始集合将更改迭代期间不允许的投影。上述代码的C#等价物如下

var colToRemove = originalCollection
  .Where(input -> newCollection.Any(i -> i.id == input.id));
foreach (var in input in colToRemove) {
  originalCollection.Remove(input);
}
您可以通过
List.ofSeq
方法使
colToRemove
成为一个独立的集合来解决此问题

 let colToRemove = 
   originalCollection
   |> Seq.filter (fun input -> Seq.exists (fun i -> i.id = input.id) newCollection) originalCollection
   |> List.ofSeq

我不会尝试删除,因为您正在修改一个集合,而是尝试创建另一个集合,如下所示:

let foo () = 

    let orig = [1;2;3;4]
    let torem = [1;2]

    let find e = 
        List.tryFind (fun i-> i = e) torem
        |> function
        | Some _-> true
        | None  -> false

    List.partition (fun e -> find e) orig
    //or
    List.filter (fun e-> find e) orig

hth

我不会尝试删除,因为您正在修改一个集合,而是尝试创建另一个集合,如下所示:

let foo () = 

    let orig = [1;2;3;4]
    let torem = [1;2]

    let find e = 
        List.tryFind (fun i-> i = e) torem
        |> function
        | Some _-> true
        | None  -> false

    List.partition (fun e -> find e) orig
    //or
    List.filter (fun e-> find e) orig