Sorting 如何在F中对数组的切片进行排序#

Sorting 如何在F中对数组的切片进行排序#,sorting,f#,slice,Sorting,F#,Slice,我想对数组的一个片段进行排序,但以下代码无法按预期工作: 让arr=[2;8;4;1] Array.sortInPlace arr printfn“%A”arr//1,2,4,8 设可变arr2=[2;8;4;1] Array.sortInPlace arr2。[1..] printfn“%A”arr2.[1..]//8,4,1。预计:1,4,8 printfn“%A”arr2//2,8,4,1。预计:2,1,4,8 mutable关键字无论如何都没有效果 如何在F#?中对数组的连续部分进行排

我想对数组的一个片段进行排序,但以下代码无法按预期工作:

让arr=[2;8;4;1]
Array.sortInPlace arr
printfn“%A”arr//1,2,4,8
设可变arr2=[2;8;4;1]
Array.sortInPlace arr2。[1..]
printfn“%A”arr2.[1..]//8,4,1。预计:1,4,8
printfn“%A”arr2//2,8,4,1。预计:2,1,4,8
mutable
关键字无论如何都没有效果


如何在F#?

中对数组的连续部分进行排序它似乎不起作用的原因是您没有将切片绑定到名称。从编译器的角度来看,
sortInPlace
调用中的切片与打印某些内容的切片不同

将切片绑定到这样的名称,它的行为将与您期望的一样:

let arr2 = [|2; 8; 4; 1|]
let slice = arr2.[1..]
Array.sortInPlace slice
printfn "%A" slice

使用
System.Array.Sort
解决。使用C#数组而不是F#,但我认为已经足够好了

让arr=[2;8;1;4]
System.Array.Sort(arr,1,arr.Length-1)
printfn“%A”arr/[| 2;1;4;8 |]
您可以使用来排序。“跨度”是围绕现有数据的视图,不会创建任何副本

开放系统
设ar=[2;8;4;1]
ar.AsSpan().Slice(1.Sort()//获取数组的跨度,从1个索引切片并对剩余元素排序
printfn“%A”ar/[| 2;1;4;8 |]

注意:仅net5支持此操作“未按预期工作”?这是什么意思?我改进了这个例子。我想在不复制数组的情况下对数组的切片进行适当排序。按照这种方式,数组的副本是有序的,而不是数组本身。这种顺序是arr2(切片)的副本,而不是arr2。我想就地订购一片arr2。也找到了库。上次更新是在2019年。此库需要更新(例如,
sort
未实现),但可以为您提供fsharp样式的代码,如
ar>Span.ofArray>Span.skip 1>Span.sort