StringComparison,以保持Directory.GetFiles在C#.NET Core中的排序

时间:2019-11-25 08:48:35

标签: c# linux .net-core

我有一个用net471编写并使用Directory.GetFiles的程序。

现在,我们希望将其转换为 .NET Core 并在 Linux 上运行。
当我们这样做时,我们得到了不同顺序的文件。

我知道文档怎么说:

  

不能保证返回文件名的顺序

但是直到我们迁移到Linux之前,文件都是固定顺序的。

我们要保持此顺序,我们需要自己编写一个比较器,还是已经存在一个比较器?

规则:

  • 下划线,不包含file.txt -> file_en.txt
  • 带数字的名称,不带file.txt -> file1.txt
  • 下划线之前的
  • Number file1.txt -> file_en.txt
  • 字母数字10.txt -> 3.txt
  • 忽略大小写AA.txt -> ab.txt -> ZZ.txt

如果有一个比较器,我们需要它与操作系统无关。

2 个答案:

答案 0 :(得分:4)

在.net框架中也不保证文件的顺序(来自.net框架文档https://docs.microsoft.com/en-us/dotnet/api/system.io.directory.getfiles?view=netframework-4.7.1):

  

不能保证返回文件名的顺序;如果需要特定的排序顺序,请使用Sort方法。

您的应用程序的行为应该不会比现在好或坏。正如文档所建议的,您可以使用Sort来保证文件的顺序。 Sort采用IComparer的实现,因此如果确实需要确保按此顺序返回事物,则可以实现上述规则。

答案 1 :(得分:2)

根据How to compare strings in C#(和 Try.NET ),您需要使用OrdinalIgnoreCase来获得这些规则。

例如:

var files = Directory.GetFiles(folderName);
Array.Sort(files, StringComparer.OrdinalIgnoreCase);