別の質問 (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" など) の使用しか許可されていません。などですが、可変プロパティではありません。