이 함수는 버블 알고리즘을 사용하여 속성으로 IO.DirectoryInfo
의 목록을 정렬합니다.IO.DirectoryInfo 속성을 매개 변수로 함수에 전달 하시겠습니까?
매개 변수에 목록을 정렬 할 속성을 어떻게 지정할 수 있습니까? 예를 들어
: "드라이브", "이름", "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
내가 필요하면 내가 대신 "이름"속성을 원하는 속성을 지정하는 함수를 호출하는 것입니다.
UPDATE 2
@Sriram Sakthivel 용액을 사용하려고하지만 MemberExpression UnaryExpression 사이에 호환 주조 대한 [등록] 변수에 예외를 던진다.
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
[this] (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이 것은 당신에게 당신의 질문에 대한 답을 줄 수 있기를 바랍니다. –