Freigeben über


Vorgehensweise: Gruppieren von Dateien nach Erweiterung (LINQ) (Visual Basic)

In diesem Beispiel wird gezeigt, wie LINQ verwendet werden kann, um erweiterte Gruppierungs- und Sortiervorgänge in Listen von Dateien oder Ordnern auszuführen. Außerdem wird gezeigt, wie die Seitenausgabe im Konsolenfenster mithilfe der Skip und Take Methoden erfolgt.

Beispiel

Die folgende Abfrage zeigt, wie der Inhalt einer angegebenen Verzeichnisstruktur anhand der Dateinamenerweiterung gruppiert wird.

Module GroupByExtension  
    Public Sub Main()  
  
        ' Root folder to query, along with all subfolders.  
        Dim startFolder As String = "C:\program files\Microsoft Visual Studio 9.0\VB\"  
  
        ' Used in WriteLine() to skip over startfolder in output lines.  
        Dim rootLength As Integer = startFolder.Length  
  
        'Take a snapshot of the folder contents  
        Dim dir As New System.IO.DirectoryInfo(startFolder)  
        Dim fileList = dir.GetFiles("*.*", System.IO.SearchOption.AllDirectories)  
  
        ' Create the query.  
        Dim queryGroupByExt = From file In fileList _  
                          Group By file.Extension.ToLower() Into fileGroup = Group _  
                          Order By ToLower _  
                          Select fileGroup  
  
        ' Execute the query. By storing the result we can  
        ' page the display with good performance.  
        Dim groupByExtList = queryGroupByExt.ToList()  
  
        ' Display one group at a time. If the number of
        ' entries is greater than the number of lines  
        ' in the console window, then page the output.  
        Dim trimLength = startFolder.Length  
        PageOutput(groupByExtList, trimLength)  
  
    End Sub  
  
    ' Pages console display for large query results. No more than one group per page.  
    ' This sub specifically works with group queries of FileInfo objects  
    ' but can be modified for any type.  
    Sub PageOutput(ByVal groupQuery, ByVal charsToSkip)  
  
        ' "3" = 1 line for extension key + 1 for "Press any key" + 1 for input cursor.  
        Dim numLines As Integer = Console.WindowHeight - 3  
        ' Flag to indicate whether there are more results to display  
        Dim goAgain As Boolean = True  
  
        For Each fg As IEnumerable(Of System.IO.FileInfo) In groupQuery  
            ' Start a new extension at the top of a page.  
            Dim currentLine As Integer = 0  
  
            Do While (currentLine < fg.Count())  
                Console.Clear()  
                Console.WriteLine(fg(0).Extension)  
  
                ' Get the next page of results  
                ' No more than one filename per page  
                Dim resultPage = From file In fg _  
                                Skip currentLine Take numLines  
  
                ' Execute the query. Trim the display output.  
                For Each line In resultPage  
                    Console.WriteLine(vbTab & line.FullName.Substring(charsToSkip))  
                Next  
  
                ' Advance the current position  
                currentLine = numLines + currentLine  
  
                ' Give the user a chance to break out of the loop  
                Console.WriteLine("Press any key for next page or the 'End' key to exit.")  
                Dim key As ConsoleKey = Console.ReadKey().Key  
                If key = ConsoleKey.End Then  
                    goAgain = False  
                    Exit For  
                End If  
            Loop  
        Next  
    End Sub  
End Module  

Die Ausgabe dieses Programms kann je nach den Details des lokalen Dateisystems und der Einstellung für startFolder lang sein. Um die Anzeige aller Ergebnisse zu aktivieren, zeigt dieses Beispiel, wie Sie ergebnisse durchblättern. Dieselben Techniken können auf Windows- und Webanwendungen angewendet werden. Beachten Sie, dass eine geschachtelte For Each-Schleife erforderlich ist, da der Code die Elemente in einer Gruppe seitenweise anzeigt. Es gibt auch eine zusätzliche Logik, um die aktuelle Position in der Liste zu berechnen und dem Benutzer das Beenden des Pagings und Beenden des Programms zu ermöglichen. In diesem speziellen Fall wird die Abfrage zum seitenweise Anzeigen gegen die zwischengespeicherten Ergebnisse aus der ursprünglichen Abfrage ausgeführt. In anderen Kontexten, z. B. LINQ to SQL, ist eine solche Zwischenspeicherung nicht erforderlich.

Kompilieren des Codes

Erstellen Sie ein Visual Basic-Konsolenanwendungsprojekt mit einer Imports Anweisung für den System.Linq-Namespace.

Siehe auch