1

別の質問 (here: 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.Name.Length 」などの DirectoryInfo プロパティの使用を管理するには、この関数で追加/変更する必要があるものは何ですか?

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」をパラメーターとして使用して関数を呼び出す上記の関数を使用して得られるものですフォルダを Name プロパティで指定するので、目的の出力が得られます。

問題は、"Name.Length" や "Parent.Name.Length" などの他のプロパティを使用する必要があることですが、この関数では """"TopLevel""" プロパティ ("Name"、"Parent" など) の使用しか許可されていません。などですが、可変プロパティではありません。

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 に答える