1

在其他问题中(这里:将 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””属性等,但不是变量属性。

4

1 回答 1

1

创建一个实现 IComparer 的类:

Public Class MyDirectoryInfoComparer
    Implements IComparer(Of IO.DirectoryInfo)

    Public Function Compare(x As IO.DirectoryInfo, y As IO.DirectoryInfo) As Integer _
        Implements IComparer(Of IO.DirectoryInfo).Compare

        ' x comes before y
        Return -1 ' or any number less than 0

        ' x is the same as y
        Return 0

        ' x comes after y
        Return 1 ' or any number greater than 0
End Function

创建您的列表:

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()

然后使用您的比较器类对其进行排序:

Folders.Sort(New MyDirectoryInfoComparer)
于 2013-11-28T01:56:35.997 回答