【发布时间】:2013-09-29 21:08:10
【问题描述】:
在其他问题中(这里:Pass an IO.DirectoryInfo property as a parameter to a function?)我询问了如何改进函数以将 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
在此函数中添加/修改以管理“Name.Length”或“Parent.名称.长度"?
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”,但该函数只允许使用“”“TopLevel”“”属性,如“Name”, “父”等,但不是变量属性。
【问题讨论】:
-
我还没有看到第 1 部分,但为什么不传递 lambda 表达式而不是字符串呢?所以你会有一些函数(x)x.parent.name.length而不是“Parent.Name.Length”,然后通过addressof或者作为变量传递它(因为简单)。
-
@Neolisk 感谢您的评论,有人向我展示了一个使用 lambda 的解决方案,但遇到了同样的问题,我已经用问题第一部分的链接更新了我的问题。我更喜欢使用字符串,因为在这种情况下 lambda 目录路径可能为空(例如:function() new directoryinfo("").Name )但我想以通用方式使用此函数,因此与其他类型的对象lambda 表达式会迫使我实例化一个对象,但我不能,我希望你能理解我,或者我对 lambda 的使用有很大的错误,但无论如何使用字符串或 lambda 我无法解决这个问题
-
你不需要实例化一个对象。您可以在尚不存在的对象上创建 lambda。将其视为纯函数。纯函数不需要任何东西存在,它们定义了工作流程。有东西进去,有东西出去,什么都没有存储。如果您想要通用方法,您可以对 Object 类型执行 lambda。没有运行时检查,几乎和字符串一样,但你保留了“不错”的 lambda 语法。
-
@Neolisk 感谢您的解释,那么我不能使用 lambdas 有任何风险:)。
-
我已经使用 lambda 版本更新了代码,请帮助我!
标签: .net vb.net linq reflection directoryinfo