获取列表子部分的首选方法是什么?为什么不支持 GetSlice?
让我们先做最后一个问题,最后一个问题:
为什么列表不支持 GetSlice
列表被实现为链表,因此我们没有有效的索引访问它们。相对而言,数组foo.[|m..n|]
需要时间,等价的语法需要列表时间。这是一件大事,因为它阻止了我们在绝大多数有用的情况下有效地使用切片语法。O(n-m)
O(n)
例如,我们可以在线性时间内将一个数组分割成大小相等的片段:
let foo = [|1 .. 100|]
let size = 4
let fuz = [|for a in 0 .. size .. 100 do yield foo.[a..a+size] |]
但是如果我们使用列表来代替呢?每次调用foo.[a..a+size]
都会花费越来越长的时间,整个操作是O(n^2)
,使其非常不适合这项工作。
大多数时候,对列表进行切片是错误的方法。我们通常使用模式匹配来遍历和操作列表。
切片列表的首选方法?
尽可能使用模式匹配。否则,您可以依靠Seq.skip
并Seq.take
为您剪切列表和序列:
> [1 .. 10] |> Seq.skip 3 |> Seq.take 5 |> Seq.toList;;
val it : int list = [4; 5; 6; 7; 8]