如何对包含表示文件名的字符串的集合进行排序

本文关键字:字符串 集合 排序 文件名 包含 表示 | 更新日期: 2023-09-27 18:25:23

我有一个包含500个文件的文件夹。每个文件名都是一个int=>,这意味着每个文件名例如都是1.txt或40.txt

在我的代码中,我将所有这些文件名加载到数组中

string[] allFiles = Directory.GetFiles(folderPath, "*.txt");

现在我需要对文件进行排序,方法是文件名是排序密钥(1.txt

怎么做?

如何对包含表示文件名的字符串的集合进行排序

API目录有排序,但如果这没有正确处理字符串(意思是"1.txt"后面跟着"10.txt"而不是"2.txt"),你可以尝试这个:

  string[] allFiles = Directory.GetFiles(folderPath, "*.txt")
                          .OrderBy(file => 
                                int.Parse(file.Substring(0, file.Length - 4)))
                          .ToArray();

这假设所有文件的格式都是正确的。如果这是有问题的,也许你想要这样的东西:

  string[] allFiles = Directory.GetFiles(folderPath, "*.txt")
                          .Select(file => {
                             var fileNamber;
                             if(!int.TryParse(
                                 file.Substring(0, file.Length - 4), out fileNamber)
                                 return (int?)null;
                             return (int?)fileNamber;
                          })
                          .Where(fileNamber => fileNamber.HasValue)
                          .OrderBy(fileNamber => fileNamber.Value)
                          .Select(fileNamber => fileNamber.Value + ".txt")
                          .ToArray();
var result = allFiles.OrderBy(f => Int32.Parse(f.Split(new char[] { '.' })[0]));

如果你确定总是有500个文件,并且它们的名称从1.txt500.txt,那么你可以简单地手动生成数组,而不是扫描目录:

string[] allFiles = Enumerable
                      .Range(1, 500)
                      .Select(i => Path.Combine(folderPath, $"{i}.txt"))
                      .ToArray();

否则,将不带扩展名的文件名解析为int进行排序:

string[] allFiles = Directory
                      .GetFiles(folderPath, "*.txt")
                      .OrderBy(x => int.Parse(x.Substring(0, x.Length - 4)))
                      .ToArray();