2015-12-03 59 views
2

我有一些文件夾包含500個文件。 每個文件名是一個INT =>那意味着每個文件的名稱是例如1.txt的或40.txt如何對包含代表文件名的字符串的集合進行排序?

在我的代碼加載所有這些文件名變爲陣列

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

,現在我需要按照文件名是排序鍵的方式對文件進行排序(1.txt

如何做到這一點?

回答

2

目錄API已經排序,但如果不處理STR英格斯權(意爲「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
var result = allFiles.OrderBy(f => Int32.Parse(f.Split(new char[] { '.' })[0])); 
1

如果您確信總是有正好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(); 
相關問題