2015-12-28 57 views
2

以下工作正常,可從指定目錄中獲取* .png和* .jpg文件列表,並按文件名排序。Directory.GetFiles上的LINQ,使用多個排序標準進行過濾和排序

DirectoryInfo di = new DirectoryInfo(HttpContext.Current.Server.MapPath("~/Images/")); 

List<string> fileNames = di.GetFiles("*.*") 
.Where(f => f.Name.EndsWith(".png") || f.Name.EndsWith(".jpg")) 
.OrderBy(f => f.Name).Select(f => f.Name).ToList(); 

我想通過使分揀作業中先用文件擴展名,然後由文件名,從而增強上述:

DirectoryInfo di = new DirectoryInfo(HttpContext.Current.Server.MapPath("~/Images/")); 

List<string> fileNames = di.GetFiles("*.*") 
    .Where(f => f.Name.EndsWith(".png") || f.Name.EndsWith(".jpg")) 
    .OrderBy(f => new {f.Extension, f.Name}).Select(f => f.Name).ToList(); 

這標誌一個運行時錯誤:At least one object must implement IComparable和OrderBy new {f.Extension, f.Name}可能是錯誤的?

我該如何解決這個問題?

回答

5

爲了指定多個排序可在初始OrderBy調用後使用ThenBy方法:

List<string> fileNames = di.GetFiles("*.*") 
    .Where(f => f.Name.EndsWith(".png") || f.Name.EndsWith(".jpg")) 
    .OrderBy(f => f.Extension) 
    .ThenBy(f => f.Name) 
    .Select(f => f.Name) 
    .ToList(); 
+0

哇!這很快,謝謝! – user2921851

0

使用下面的代碼來解決問題

List<string> fileNames = di.GetFiles("*.*") 
     .Where(f => f.Name.EndsWith(".png") || f.Name.EndsWith(".jpg")) 
     .OrderBy(f => f.Extension) 
     .ThenByDescending(f => f.Name) 
     .Select(f => f.Name).ToList(); 
相關問題