【发布时间】:2015-09-09 00:43:20
【问题描述】:
考虑分别对C# 和F# 中的字符串进行简单排序的两个代码片段:
C#:
var strings = new[] { "Tea and Coffee", "Telephone", "TV" };
var orderedStrings = strings.OrderBy(s => s).ToArray();
F#:
let strings = [| "Tea and Coffee"; "Telephone"; "TV" |]
let orderedStrings =
strings
|> Seq.sortBy (fun s -> s)
|> Seq.toArray
这两段代码返回不同的结果:
- C#:茶和咖啡、电话、电视
- F#:电视、茶和咖啡、电话
在我的具体情况下,我需要关联这两种语言之间的排序逻辑(一种是生产代码,一种是测试断言的一部分)。这提出了几个问题:
- 排序逻辑的差异是否存在根本原因?
- 在我的情况下,克服这个“问题”的推荐方法是什么?
- 这种现象是字符串特有的,还是也适用于其他 .NET 类型?
编辑
为了响应几个探测 cmets,运行下面的片段可以更多地了解这种排序差异的确切性质:
F#:
let strings = [| "UV"; "Uv"; "uV"; "uv"; "Tv"; "TV"; "tv"; "tV" |]
let orderedStrings =
strings
|> Seq.sortBy (fun s -> s)
|> Seq.toArray
C#:
var strings = new[] { "UV", "Uv", "uv", "uV", "TV", "tV", "Tv", "tv" };
var orderedStrings = strings.OrderBy(s => s).ToArray();
给予:
- C#:电视,电视,电视,电视,紫外线,紫外线,紫外线,紫外线
- F#:电视、电视、紫外线、紫外线、电视、电视、紫外线、紫外线
字符串的字典顺序不同,因为字符的基本顺序不同:
- C#:“aAbBcCdD...tTuUvV...”
- F#:“ABC..TUV..Zabc..tuv..”
【问题讨论】:
-
如果你这样做,似乎工作“很好”
(fun s -> s.ToLower()) -
这很奇怪......我真的希望这在 F# 中可以正常工作。如果你有以不同字母开头的单词,它们如何在 F# 中显示?
-
感谢@leppie - 这是“字符串大小写”的一个很好的解决方案。我的实际代码更通用 - 依赖于比较实现。如果我知道这是异常情况,将字符串作为特殊情况处理是可以接受的 - 但我怀疑发生的事情比我理解的要多......
-
可以用 [| 《茶与咖啡》; “电话”; "Tv" |] |> Array.sort 必须是大写
-
根据this questionF#的
sortBy方法没有使用Linq的OrderBy()。
标签: c# string sorting f# collation