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

时间:2015-12-03 04:13:55

标签: c#

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

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

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

现在我需要对文件进行排序,文件名是排序键(1.txt

怎么做?

3 个答案:

答案 0 :(得分:2)

目录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();

答案 1 :(得分:1)

var result = allFiles.OrderBy(f => Int32.Parse(f.Split(new char[] { '.' })[0]));

答案 2 :(得分:1)

如果您确定总有500个文件,并且它们从1.txt命名为500.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();