我需要一个支持
的类似数组的数据结构a.[i]
及时O(1)和
a.[i..j]
也在时间O(1)。
O(1)更新不要求。实际上,我需要的是一个具有就地切片或子阵列概念的常量数组。
我当然可以从Array
构建这样的东西,但如果我可以使用已经存在的东西,我会更开心吗?
答案 0 :(得分:12)
为此,.NET标准库的类型为ArraySegment<'T>
。不幸的是,它没有允许您分别使用Item
和GetSlice
语法的方法.[x]
和.[x..y]
。但是你可以添加它们:
type System.ArraySegment<'T> with
member this.Item(x) =
if x < 0 || x >= this.Count then
raise (System.IndexOutOfRangeException("Index was outside the bounds of the array segment."))
this.Array.[x + this.Offset]
member this.GetSlice(start: int option, finish : int option) =
let start = defaultArg start 0
let finish = defaultArg finish (this.Count - 1)
if start < 0 || finish >= this.Count then
raise (System.IndexOutOfRangeException("Index was outside the bounds of the array segment."))
new ArraySegment<'T>(this.Array, this.Offset + start, finish - start + 1)