在其他问题中(这里:将 IO.DirectoryInfo 属性作为参数传递给函数?)我询问了如何改进函数以将 DirectoryInfo 属性作为参数传递,问题是代码仅适用于“顶级”属性如“名称”、“根”、“驱动器”等...
但我需要使用这样的功能:
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.Length”和“Parent.Name.Length”等其他属性,但该函数只允许使用“Name”、“Parent”等“”“TopLevel””属性等,但不是变量属性。