2014-10-01 84 views
2

我需要從目錄中獲取按名稱排序的文件列表。從目錄獲取按名稱排序的文件列表

我的文件被命名爲:

TestFile_1.xml, 
TestFile_2.xml 
TestFile_3.xml 
. 
. 
TestFile_10.xml 
TestFile_11.xml 

我使用下面的代碼片段與此snnipet排序

DirectoryInfo di = new DirectoryInfo(jsonFileInfo.FolderPath); 
FileSystemInfo[] files = di.GetFileSystemInfos(); 
var orderedFiles = files.OrderBy(f => f.Name);` 

,我得到的結果

TestFile_1.xml, 
TestFile_10.xml 
TestFile_11.xml 
. 
. 
TestFile_2.xml 
TestFile_3.xml 
. 
. 

我如何把它分類?

+2

已經工作。否則,您應該澄清要求。名稱是一個字符串,字符串不知道「10」比「2」大。 – 2014-10-01 14:52:16

+1

簡單的解決方案:命名文件'TestFile_01'而不是'TestFile_1' – DavidG 2014-10-01 14:52:54

+0

我無法將文件從'TestFile_1'重命名爲'TestFile_01'。文件名將始終保持爲「TestFile1」 – Sameer 2014-10-01 14:55:19

回答

5

名稱是一個字符串,而"10"不是大於「2」的大於。如果您想通過數字下劃線後排序:

var orderedFiles = files 
    .Select(f => new{ 
     File = f, 
     NumberPart = f.Name.Substring(f.Name.IndexOf("_") + 1) 
    }) 
    .Where(x => x.NumberPart.All(Char.IsDigit)) 
    .Select(x => new { x.File, Number = int.Parse(x.NumberPart) }) 
    .OrderBy(x => x.Number) 
    .Select(x => x.File); 

如果要包括不與數字結尾反正所有的文件,這些應該放在第一位:

orderedFiles = files 
    .Select(f => new 
    { 
     File = f, 
     NumberPart = f.Name.Substring(f.Name.IndexOf("_") + 1) 
    }) 
    .Select(x => new { x.File, x.NumberPart, AllDigit = x.NumberPart.All(Char.IsDigit) }) 
    .Select(x => new 
    { 
     x.File, 
     Number = x.AllDigit ? int.Parse(x.NumberPart) : (int?)null 
    }) 
    .OrderBy(x => x.Number.HasValue) 
    .ThenBy(x => x.Number ?? 0) 
    .Select(x => x.File); 

如果您即使想要一個靜態文件名總是在頂部(如評論),您可以使用:

.... 
.OrderByDescending(x => x.File.Name.Equals("TestFile_cover.xml", StringComparison.CurrentCultureIgnoreCase)) 
.ThenBy(x => x.Number.HasValue) 
.ThenBy(x => x.Number ?? 0) 
.Select(x => x.File); 
+0

如果我的所有文件都遵循模式TestFile_ [number] .xml,但並非所有文件都遵循模式TestFile_ [ number] .xml,列表中的第一個文件應始終爲'TestFile_cover.xml' – Sameer 2014-10-01 15:10:12