2013-09-29 16 views
0

У меня есть список DirectoryInfo, содержащие имена папок, как это:Bubble Сортировать список с помощью LINQ?

80's 
90's 
2000 
2001 

Проблема заключается в том, что «IO.Directory.GetDirectories» функция возвращает общий Microsoft Сортировать так мой список отсортирован как это:

2000 
2001 
80's 
90's 

Я знаю, что алгоритм для пузырьковой сортировки (всегда, когда я вижу использование в ФОР и на ген я не вижу никакого метода сортировки Bubble, который я видел), и я надеюсь, что если сортировка Bubble может быть упрощена с использованием LINQ или других улучшенных методов, но не для ни для создания дополнительных объектов в памяти.

Как я могу Bubble СортировкаList (Of DirectoryInfo) по их Directory.Name собственности? (очевидно, я хочу сохранить объекты DirectoryInfo, а не возвращать пару отсортированных строк), а также, возможно, создать пузырь, не перераспределяя список с помощью LINQ-расширений?

UPDATE:

Если кто-то нужна информация это функция, которую я использую, чтобы получить список DirectoryInfo:

' Get Folders 
Private Function Get_Folders(ByVal directory As String, ByVal recursive As Boolean) As List(Of IO.DirectoryInfo) 
    Dim searchOpt As IO.SearchOption = If(recursive, IO.SearchOption.AllDirectories, IO.SearchOption.TopDirectoryOnly) 
    Return IO.Directory.GetDirectories(directory, "*", searchOpt).Select(Function(p) New IO.DirectoryInfo(p)).ToList 
End Function 

UPDATE 2

Следуя рекомендациям по поводу комментариев, я пытаюсь упростить код всего в нескольких строках с использованием регулярных выражений и LINQ-расширений, обрабатывающих имена папок как целые числа для их сортировки, проблема в том, что он не работает, потому что у меня есть несколько папок, которые не могут быть преобразованы в числа, это примеры имен папок:

80's 
90's 
2000-2006 
2007 
2008 
Classic 
B.S.O 
Maquetas 

Мой вопрос Если я могу Exlude папки нецифровой при сортировке, а затем добавить, что исключенные папки для отсортированных имен папок «целых», я задаю этот вопрос просто не получить все папки два раза в сгенерируйте два разных списка, чтобы присоединиться к ним.

Также обратите внимание на имя папки «2000-2006», если я преобразую имя в целое число, я бы не получил ожидаемый результат при сортировке.

Так как же я мог бы Bubble сортировать содержимое папки списка, рассматривая их как то, что есть?, Строки, а не цифры.

Public Class Form1 

Dim regex As New System.Text.RegularExpressions.Regex("\D") 

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Shown 

    For Each folder In Get_Folders("E:\Música\Canciones", False) _ 
         .OrderBy(Function(x) Convert.ToInt32(regex.Replace(x.Name, ""))) 

     MsgBox(folder.Name) 
     ' Exception here, because a folder named "B.S.O" and other named as "Classic", 
     ' obviouslly they can't be converted to Integer :(

    Next 

End Sub 

' Get Folders 
Private Function Get_Folders(ByVal directory As String, ByVal recursive As Boolean) As List(Of IO.DirectoryInfo) 
    Dim searchOpt As IO.SearchOption = If(recursive, IO.SearchOption.AllDirectories, IO.SearchOption.TopDirectoryOnly) 
    Return IO.Directory.GetDirectories(directory, "*", searchOpt).Select(Function(p) New IO.DirectoryInfo(p)).ToList 
End Function 

End Class 
+0

http://stackoverflow.com/a/11052176/932418 –

+0

@l.B Thankyou, это решение немного жестко закодировано. Я пытаюсь удалить все ненужные вещи, такие как расщепления и подстроки, но, возможно, мне может понадобиться помощь для ретуширования этого решения, потому что я не знаю, будет ли результат работать с моим списком , – ElektroStudios

+0

Elektro Hacker, я протестировал это решение, и оно работает для вашего дела (я говорю о своем ответе не о согласии :)). –

ответ

1

Я перевел код in referenced question с помощью Telerik-х online converter. Он также подходит для вашего дела.

Public Shared Function CustomSort(list As IEnumerable(Of String)) As IEnumerable(Of String) 
    Dim maxLen As Integer = list.[Select](Function(s) s.Length).Max() 

    Return list.[Select](Function(s) New With { _ 
     Key .OrgStr = s, _ 
     Key .SortStr = System.Text.RegularExpressions.Regex.Replace(s, "(\d+)|(\D+)", Function(m) m.Value.PadLeft(maxLen, If(Char.IsDigit(m.Value(0)), " "c, Char.MaxValue))) _ 
    }).OrderBy(Function(x) x.SortStr).[Select](Function(x) x.OrgStr) 
End Function 
+0

Я попытался использовать его, передавая в качестве параметра список io.directoryinfo, внося некоторые изменения внутри функции, но просто невозможно для меня, не могли бы вы мне помочь отредактировать код? EDIT: В конце концов, я получил добавление «.Tolist» при возврате данных, спасибо огромное, я опубликую модификацию. – ElektroStudios

+0

Он отлично работает. – ElektroStudios

1

Маленькая модификация @ L.B решение, я надеюсь, что это поможет кому-то еще:

Public Shared Function CustomSort(list As List(Of IO.DirectoryInfo)) As List(Of IO.DirectoryInfo) 

     Dim maxLen As Integer = list.[Select](Function(s) s.Name.Length).Max() 

     Return list.[Select](Function(s) New With { _ 
      Key .OrgStr = s, _ 
      Key .SortStr = System.Text.RegularExpressions.Regex.Replace(s.Name, "(\d+)|(\D+)", Function(m) m.Value.PadLeft(maxLen, If(Char.IsDigit(m.Value(0)), " "c, Char.MaxValue))) _ 
     }).OrderBy(Function(x) x.SortStr).[Select](Function(x) x.OrgStr).ToList 
    End Function 
Смежные вопросы