2013-06-21 70 views
4

我發現了類似的東西here,但一直無法讓它工作。我對LINQ很陌生,所以不能完全確定它發生了什麼。任何幫助,將不勝感激。我有類似的目錄名稱:C#使用LINQ排序目錄名稱

directory-1 
article-about-something-else 

我想按名稱對這些進行排序,但目前爲止還沒有辦法。它們位於RedHat服務器上的網絡驅動器上。目錄列表以亂七八糟的順序出現亂碼。

下面是一些什麼,我已經試過:

DirectoryInfo dirInfo = new DirectoryInfo("Z:\\2013"); 
var dirs = dirInfo.GetDirectories().OrderBy(d => dirInfo.Name); 
foreach (DirectoryInfo dir in dirs) 
{ 
    string month = dir.Name; 
    Console.WriteLine(dir.Name); 
    var monthDirInfo = new DirectoryInfo("Z:\\2013\\" + month); 
    var monthDirs = monthDirInfo.GetDirectories().OrderBy(d => monthDirInfo.CreationTime); 
    foreach (DirectoryInfo monthDir in monthDirs) 
    { 
     string article = monthDir.Name; 
     Console.WriteLine(monthDir.Name); 
     sb.AppendLine("<li><a href=\"/2013/" + month + "/" + article + "\">" + TextMethods.GetTitleByUrl("2013/" + month + "/" + article) + "</a></li>"); 
    } 
} 

任何幫助將不勝感激。我目前有點不知所措。我相信我也錯過了一些明顯的東西。

+4

使用'd => d.Name' – Sayse

+0

我會試一試,但是當我使用'f => f.Name'時 – ahwm

+1

有兩種情況... monthDirInfo應該完全一樣作爲目錄,爲什麼要創建一個新的對象?也Sayse是正確的,你需要使用d => d.Name。 –

回答

5

您按照根文件夾的名稱而不是每個子目錄的名稱進行排序。

因此改變......

var dirs = dirInfo.GetDirectories().OrderBy(d => dirInfo.Name); 

到...

var dirs = dirInfo.EnumerateDirectories().OrderBy(d => d.Name); 

var monthDirs = monthDirInfo.GetDirectories() 
    .OrderBy(d => monthDirInfo.CreationTime); 

到...

var monthDirs = monthDirInfo.EnumerateDirectories() 
    .OrderBy(d => d.CreationTime); 

我使用了EnumerateDirectories,因爲它更高效。 GetDirectories將在開始排序前收集所有目錄。

+0

Erm ..那將是d.name或n => n.Name肯定? –

+0

@DaveWilliams:謝謝,糾正。 –

3
dirInfo.GetDirectories().OrderBy(d => d.Name); 
2
var dirs = dirInfo.GetDirectories().OrderBy(d => d.Name); 

LINQ是關於動態創建「功能」 ......所以,你在這裏創造一個函數,在一個名爲「d」表示當前記錄的變量,並返回到d.Name分類。