自己紹介

自分の写真

朝ネスのマスターやってる人。
巷では「けもネス」って呼ばれてるけど、「朝ネス」です。
どうか間違えないでください。

2017年2月15日水曜日

VB.NET:フォルダ優先で一覧を表示させる

ファイル・フォルダ一覧のパスがあるけどフォルダを優先して出したい。
深さ優先探索みたいなソートを再帰無しで書きたい。
そんなときに!

下のコードの表示先はListBox1だから気を付けてね。

やってることは簡単で、
符号の順序を利用してソートすれば、
再帰的なソートを必要とするモノでも再帰コード書かなくていいよ、速いよって事。

並び替えるモノを符号化してソートすると意外と簡単にできたりする。
もちろん一旦符号化しないといけないからその分の時間は掛かるけどね。

-----------------------------------------

        Dim folders As String() = System.IO.Directory.GetDirectories("C:\hogehoge\", "*", 1)
        Dim files As String() = System.IO.Directory.GetFiles("C:\hogehoge", "*", 1)

        'ソート
        Array.Sort(folders)
        Array.Sort(files)


        '見つけたものを次々に符号化
        Dim 符号リスト As New Hashtable
        Dim パス As String
        Dim ノードリスト As String()
        Dim ノード As String
        Dim インデックス As Int32 = 0
        For Each パス In folders
            ノードリスト = パス.Split("\"c)
            For Each ノード In ノードリスト
                If Not 符号リスト.ContainsKey(ノード) Then
                    符号リスト(ノード) = "," & インデックス.ToString("D6")
                    インデックス += 1
                End If
            Next
        Next
        For Each パス In files
            Dim ファイルデータ = New System.IO.FileInfo(パス)
            ノードリスト = パス.Split("\"c)
            For Each ノード In ノードリスト
                If ノード = ファイルデータ.Name Then
                    符号リスト(ノード) = "-" & インデックス.ToString("D6")
                    インデックス += 1
                ElseIf Not 符号リスト.ContainsKey(ノード) Then
                    符号リスト(ノード) = "," & インデックス.ToString("D6")
                    インデックス += 1
                End If
            Next
        Next

        'ソートリストを用意
        Dim sss As New SortedList(Of String, String)
        Dim aaa As New Text.StringBuilder

        'Keyは符号化したやつ、
        For Each パス In folders
            ノードリスト = パス.Split("\"c)
            aaa.Clear()
            For Each ノード In ノードリスト
                aaa.Append(符号リスト(ノード))
            Next
            sss.Add(aaa.ToString, パス)
        Next
        For Each パス In files
            Dim ファイルデータ = New System.IO.FileInfo(パス)
            ノードリスト = パス.Split("\"c)
            aaa.Clear()
            For Each ノード In ノードリスト
                aaa.Append(符号リスト(ノード))
            Next
            sss.Add(aaa.ToString, パス)
        Next

        For Each パス In sss.Values
            ListBox1.Items.Add(パス)
        Next

0 件のコメント:

コメントを投稿