【问题标题】:Using Directory.GetFiles() WITH multiple extensions AND sort order使用具有多个扩展名和排序顺序的 Directory.GetFiles()
【发布时间】:2013-09-01 10:18:51
【问题描述】:

我必须得到一个目录文件列表,根据多个扩展名过滤...并排序!

我使用这个,这是我发现的在多个扩展上过滤目录内容的最快方法:

Dim ext As String() = {"*.jpg", "*.bmp","*png"}
Dim files As String() = ext.SelectMany(Function(f) Directory.GetFiles(romPath, f)).ToArray
Array.Sort(files)

然后使用数组排序。

我想知道(这是我的问题;))是否有办法在同一条主线上进行排序?一种:

Dim files As String() = ext.SelectMany(Function(f) Directory.GetFiles(romPath, f).**Order By Name**).ToArray

如果是的话,如果我能加快速度而不是在最后对数组进行排序(但我会做我的测试和报告..一旦我得到一个解决方案!!)? 谢谢你的帮助!!

【问题讨论】:

    标签: vb.net sorting getfiles


    【解决方案1】:

    您可以使用 OrderBy() Linq 扩展方法,如下所示:

        Dim ext = {"*.jpg", "*.bmp", "*png"}
        Dim files = ext.SelectMany(Function(f) Directory.GetFiles(romPath, f)). _
                    OrderBy(Function(f) f). _
                    ToArray()
    

    这对速度没有任何影响,排序本质上是 O(nlog(n)) 复杂度。 确实在存储方面有所不同,OrderBy() 具有 O(n) 存储要求。 Array.Sort() 就地排序。对于小的n 值来说没什么大不了的,就像您在磁盘目录上所期望的那样。

    【讨论】:

    • 这真的很容易使用和理解。谢谢。
    【解决方案2】:
    enter code hereIf Count = 4 Then
            MsgBox("done")
        ElseIf Count = 0
            Dim aryFi As IO.FileInfo() = (di.GetFiles("*.mp4", IO.SearchOption.AllDirectories))
            For Each fi In aryFi
                Dim ico As Icon = Icon.ExtractAssociatedIcon(fi.FullName)
                Dim imagelistsmall As New ImageList()
                Dim item As New ListViewItem(fi.FullName)
                Dim li As ListViewItem
                Try
                    li = ListView1.Items.Add(fi.Name, ImageList1.Images.Count)
                    li.Tag = fi.FullName
                    ImageList1.Images.Add(Bitmap.FromFile(fi.FullName))
    
                    ListView1.LargeImageList = ImageList1
                    ListView1.View = View.List
                    Me.Controls.Add(ListView1)
    
                Catch ex As Exception
    
                End Try
            Next
            Count = (Count.ToString + 1)
            sack()
    
        ElseIf Count = 1
            Dim aryFi2 As IO.FileInfo() = (di.GetFiles("*.mov", IO.SearchOption.AllDirectories))
            For Each fi In aryFi2
    
                Dim ico As Icon = Icon.ExtractAssociatedIcon(fi.FullName)
                Dim imagelistsmall As New ImageList()
                Dim item As New ListViewItem(fi.FullName)
                Dim li As ListViewItem
                Try
                    li = ListView1.Items.Add(fi.Name, ImageList1.Images.Count)
                    li.Tag = fi.FullName
                    ImageList1.Images.Add(Bitmap.FromFile(fi.FullName))
    
                    ListView1.LargeImageList = ImageList1
                    ListView1.View = View.List
                    Me.Controls.Add(ListView1)
    
                Catch ex As Exception
    
                End Try
            Next
            Count = (Count.ToString + 1)
            sack()
        ElseIf Count = 2
            Dim aryFi3 As IO.FileInfo() = (di.GetFiles("*.flv", IO.SearchOption.AllDirectories))
            For Each fi In aryFi3
    
                Dim ico As Icon = Icon.ExtractAssociatedIcon(fi.FullName)
                Dim imagelistsmall As New ImageList()
                Dim item As New ListViewItem(fi.FullName)
                Dim li As ListViewItem
                Try
                    li = ListView1.Items.Add(fi.Name, ImageList1.Images.Count)
                    li.Tag = fi.FullName
                    ImageList1.Images.Add(Bitmap.FromFile(fi.FullName))
    
                    ListView1.LargeImageList = ImageList1
                    ListView1.View = View.List
                    Me.Controls.Add(ListView1)
    
                Catch ex As Exception
    
                End Try
            Next
            Count = (Count.ToString + 1)
            sack()
        ElseIf Count = 3
            Dim aryFi4 As IO.FileInfo() = (di.GetFiles("*.avi", IO.SearchOption.AllDirectories))
            For Each fi In aryFi4
    
                Dim ico As Icon = Icon.ExtractAssociatedIcon(fi.FullName)
                Dim imagelistsmall As New ImageList()
                Dim item As New ListViewItem(fi.FullName)
                Dim li As ListViewItem
                Try
                    li = ListView1.Items.Add(fi.Name, ImageList1.Images.Count)
                    li.Tag = fi.FullName
                    ImageList1.Images.Add(Bitmap.FromFile(fi.FullName))
    
                    ListView1.LargeImageList = ImageList1
                    ListView1.View = View.List
                    Me.Controls.Add(ListView1)
    
                Catch ex As Exception
    
                End Try
            Next
            Count = (Count.ToString + 1)
            sack()
        End If
    

    【讨论】:

    • 投反对票,因为您确实需要向其中添加 cmets。没有任何解释会导致混乱。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-21
    • 2010-09-08
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多