Эта функция использует алгоритм пузыря для сортировки списка IO.DirectoryInfo
по их Name
.Передайте свойство IO.DirectoryInfo как параметр функции?
Как я могу указать в параметре свойство, которое я буду сортировать по списку?
Например: "Drive", "Имя", "name.length", "Directory.Parent", и т.д ...
То, что я думал, что это хорошая идея (может быть, это не хорошо, я не не знаю, насколько это можно улучшить) заключается в том, чтобы передать параметр как строку, а затем передать строку как ...? Здесь я потерялся.
Public Shared Function BubbleSort_List(list As List(Of IO.DirectoryInfo), ByVal SortByProperty As ...) As List(Of IO.DirectoryInfo)
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) folder.Name.Length).Max, _
If(Char.IsDigit(m.Value(0)), " "c, Char.MaxValue))) _
}).OrderBy(Function(x) x.SortStr).Select(Function(x) x.OrgStr).ToList
End Function
UPDATE:
Уведомление эта часть кода выше:
list.Select(Function(folder) folder.Name.Length).Max
Что мне нужно, чтобы вызвать функцию определения свойство, которое я хочу вместо этого свойство «Name».
ОБНОВЛЕНИЯ 2
Попытка использовать решение @Sriram Sakthivel, но он вызывает исключение на [собственности] переменный о несовместимом литье между УнарноеВыражением к MemberExpression.
Imports System.Reflection
Imports System.Linq.Expressions
Private Sub Test(sender As Object, e As EventArgs) Handles MyBase.Shown
' Here I create the list
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()
' Here I try to loop the list at the same time I try to sort it,
' specifying the property I want using @Sriram Sakthivel solution,
' This part does not work because the second parametter is wrong.
For Each folderinfo In BubbleSort_List(Folders, Function() Name)
MsgBox(folderinfo.Name)
Next
End Sub
Private Function BubbleSort_List(list As List(Of IO.DirectoryInfo), exp As Expression(Of Func(Of Object))) As List(Of IO.DirectoryInfo)
Dim [property] As PropertyInfo = DirectCast(DirectCast(exp.Body, MemberExpression).Member, PropertyInfo)
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([property].GetValue(folder, Nothing), String).Length).Max(), _
If(Char.IsDigit(m.Value(0)), " "c, Char.MaxValue))) _
}).OrderBy(Function(x) x.SortStr).Select(Function(x) x.OrgStr).ToList
End Function
Вы ищете [это] (http://stackoverflow.com/questions/41244/dynamic-linq-orderby-on-ienumerablet)? –
@Sriram Sakthivel спасибо за комментарий, это не то, что я ищу (или, я думаю, с большим количеством кода C#, я не могу понять все, что делает этот код), см. Мое обновление. – ElektroStudios
Извинения за то, что вы не даете пример VB.NET, но вот способ C# получить имя свойства через лямбда, который похож на то, что вы ищете: http://stackoverflow.com/questions/671968/retrieving- property-name-from-lambda-expression Надеюсь, это даст вам руку с вашим вопросом. –