Linq.OrderBy在不同机器上生成不同排序结果的问题求助
Linq.OrderBy在不同机器上生成不同排序结果的问题求助
嗨,这个问题我之前也碰到过,大概率是系统文化(Culture)差异导致的字符串排序规则不一致!
你的MacBook Pro和Ubuntu Docker容器默认的区域设置、字符排序规则不一样,而Linq的OrderBy默认会使用当前运行环境的文化信息来做字符串比较,这就造成了相同代码在不同环境下排序结果不同。比如MacOS和Linux对某些特殊字符、大小写的排序优先级定义可能有细微差别,尤其是涉及非ASCII字符的时候。
给你两个靠谱的解决方案:
- 指定与系统无关的序數比较器
这是最稳妥的做法,直接用StringComparer.Ordinal或者StringComparer.OrdinalIgnoreCase来强制基于字符的Unicode码点做比较,完全不受系统文化影响。
比如把你的排序代码改成这样:
// 区分大小写的序數排序 var sortedFiles = files.OrderBy(f => f.Name, StringComparer.Ordinal).ToList(); // 如果不需要区分大小写,用这个 var sortedFiles = files.OrderBy(f => f.Name, StringComparer.OrdinalIgnoreCase).ToList();
- 统一容器的文化设置
如果你不想改代码,可以在Docker容器里设置和Mac一致的区域文化(比如en_US.UTF-8),不过这种方式不如第一种可靠,毕竟不同系统的同文化排序规则可能还是有差异。
另外,你贴的容器执行输出里的内容看起来像是文件的哈希值?不过核心问题还是排序规则的差异,按上面的方法改应该就能解决啦!
备注:内容来源于stack exchange,提问作者Franz
相关产品推荐
相关产品推荐

