В другом вопросе (здесь: Передайте IO. Свойство DirectoryInfo в качестве параметра функции?) Я спросил о том, как улучшить функцию для передачи свойства DirectoryInfo в качестве параметра, проблема в том, что код работает только со свойствами "" верхнего уровня", такими как "Имя", " Root», «Диск» и т. д.
Но мне нужно было бы использовать такую функцию:
Dim Folders As List(Of IO.DirectoryInfo) = blah bla blah...
For Each folderinfo In Bubble_Sort_List_DirectoryInfo(Folders, Function() New IO.DirectoryInfo("").Name)
MsgBox(folderinfo.Name)
Next
Но мне нужно использовать такую функцию еще:
For Each folderinfo In Bubble_Sort_List_DirectoryInfo(Folders, Function() New IO.DirectoryInfo("").Parent.Name.Length)
MsgBox(folderinfo.Name)
Next
Что необходимо добавить/изменить в этой функции для управления использованием свойств DirectoryInfo, таких как "Name.Length" или "Parent.Name.Length" "?
Private Shared Function Bubble_Sort_List_DirectoryInfo(list As List(Of IO.DirectoryInfo), _
exp As Expression(Of Func(Of Object))) _
As List(Of IO.DirectoryInfo)
Dim member As MemberExpression = _
If(TypeOf exp.Body Is UnaryExpression, _
DirectCast(DirectCast(exp.Body, UnaryExpression).Operand, MemberExpression), _
DirectCast(exp.Body, MemberExpression))
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( _
list.Select(Function(folder) DirectCast(DirectCast(member.Member, PropertyInfo) _
.GetValue(folder, Nothing), Object).ToString.Length).Max(), _
If(Char.IsDigit(m.Value(0)), " "c, Char.MaxValue))) _
}).OrderBy(Function(x) x.SortStr).Select(Function(x) x.OrgStr).ToList
End Function
ОБНОВИТЬ:
Это лишь некоторые пояснения и примеры.
Внутри каталога моего диска у меня есть несколько папок с такими именами папок:
80's
90's
2000-2006
2007
2008
В моем приложении я получаю папки с помощью метода "IO.Directory.GetDirectories" и сохраняю их в список DirectoryInfo().
Это входной список:
Dim Folders As List(Of IO.DirectoryInfo) = _
IO.Directory.GetDirectories("E:\Música\Canciones", "*", IO.SearchOption.TopDirectoryOnly) _
.Select(Function(p) New IO.DirectoryInfo(p)).ToList()
... Но метод «IO» заставляет содержимое списка сортироваться как строка, например:
2000-2006
2007
2008
80's
90's
Мой желаемый результат таков:
80's
90's
2000-2006
2007
2008
Итак, после создания списка с использованием метода «IO» мне нужно будет отсортировать содержимое списка, чтобы получить желаемый результат И ЭТО ИМЕННО ТО, ЧТО Я ПОЛУЧУ, ИСПОЛЬЗУЯ ФУНКЦИЮ ВЫШЕ, вызвав функцию, используя свойство «Имя». " в качестве параметра для пузырьковой сортировки папок по их свойству Name, поэтому я получаю желаемый результат.
проблема в том, что мне нужно использовать другие свойства, такие как "Name.Length" и "Parent.Name.Length", но функция позволяет использовать только свойство """TopLevel""", например "Name", "Parent" и т. д., но не переменные свойства.