Fable icon indicating copy to clipboard operation
Fable copied to clipboard

sorting a Resizearray differs from .NET

Open goswinr opened this issue 3 years ago • 1 comments

I noticed that sorting a ResizeArray in Fable does not match .NET behaviour. Is this a known limitation (or a bug) ?

let a = [| "a"; "Z" |] |> Array.sort
printfn "%s" a.[0] // "Z" in fable and fsi

let r = ResizeArray(a)
r.Sort()
printfn "%s" r.[0] // "Z" in fable repl, "a" in fsi.exe

REPL: 3.2.6 Fable: 3.2.5

(I would actually argue that the .NET and F# behavior is confusing, but that's another discussion.)

goswinr avatar Aug 16 '21 13:08 goswinr

I think this is a consequence of .NET trying to respect the systems language settings when it comes to strings. I can reproduce the behavior of FSI in the browser console with this:

const a = ['a', 'Z']

a.sort((a, b) => a.localeCompare(b))
// > Array [ "a", "Z" ]

a.sort()
// > Array [ "Z", "a" ]

On the other hand, the standard Array.sort function seems to use ordinal sorting, like JS and most other platforms and languages. The behavior you see in FSI can be reproduced with this C# snippet:

using System;
using System.Collections.Generic;
using System.Globalization;

var a = new List<string> { "a", "Z" };

// Same as a.Sort()
a.Sort(StringComparer.Create(new CultureInfo("de"), ignoreCase: false));
Console.WriteLine(a[0]); // a
Console.WriteLine(a[1]); // Z

// Same as [| "a"; "Z" |] |> Array.sort
a.Sort(StringComparer.Ordinal);
Console.WriteLine(a[0]); // Z
Console.WriteLine(a[1]); // a

inosik avatar Aug 17 '21 06:08 inosik