【问题标题】:StringComparison to keep the Directory.GetFiles sort in C# .NET CoreStringComparison 在 C# .NET Core 中保持 Directory.GetFiles 排序
【发布时间】:2019-11-25 08:48:35
【问题描述】:

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

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

我知道文档是怎么说的:

不保证返回文件名的顺序

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

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

规则:

  • 下划线后无:file.txt -> file_en.txt
  • 名字加数字后不加:file.txt -> file1.txt
  • 下划线前的数字file1.txt -> file_en.txt
  • 字母数字10.txt -> 3.txt
  • 忽略大小写AA.txt -> ab.txt -> ZZ.txt

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

【问题讨论】:

    标签: c# linux .net-core


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      例如:

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

      【讨论】:

      • 不适用于数值比较,例如10.txt -> 3.txt(根据 OP 要求)
      • @MatthewWatson - 它确实有效,因为 OP 希望数字按字母顺序排序。而OrdinalIgnoreCase string "10" 则“小于”"3"
      • 啊,我读 10.txt -> 3.txt 的意思是 10 应该跟随 3 (我读 > 为“大于”)。
      • @Matthew Watson 你建议我写什么而不是->
      • @baruchiro 你写的很好 - 我只是没有正确解析它:)我想你可以说你需要"10.txt" < "3.txt"(使用<作为“小于”) ,但实际上没有必要。
      猜你喜欢
      • 2010-09-08
      • 1970-01-01
      • 2020-12-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多