2013-06-21 4 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

use 'd => d.Name' – Sayse

+0

Я попробую, но это не сработало, когда я использовал' f => f.Name' – ahwm

+1

Две вещи ... monthDirInfo должен быть точно таким же как dir так зачем создавать новый объект? Также 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 к Сортировать.