Procedure: Bestanden groeperen op extensie (LINQ) (Visual Basic)
In dit voorbeeld ziet u hoe LINQ kan worden gebruikt om geavanceerde groeperings- en sorteerbewerkingen uit te voeren op lijsten met bestanden of mappen. Ook ziet u hoe u pagina-uitvoer in het consolevenster kunt weergeven met behulp van de Skip en Take methoden.
Opmerking
De volgende query laat zien hoe u de inhoud van een opgegeven mapstructuur kunt groeperen op basis van de bestandsnaamextensie.
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
De uitvoer van dit programma kan lang zijn, afhankelijk van de details van het lokale bestandssysteem en waarop het startFolder
is ingesteld. Als u het weergeven van alle resultaten wilt inschakelen, ziet u in dit voorbeeld hoe u door de resultaten kunt bladeren. Dezelfde technieken kunnen worden toegepast op Windows- en webtoepassingen. U ziet dat omdat de codepagina's van de items in een groep een geneste For Each
lus vereist zijn. Er is ook een aantal extra logica voor het berekenen van de huidige positie in de lijst en om de gebruiker in staat te stellen het pagineren te stoppen en het programma af te sluiten. In dit geval wordt de pagingquery uitgevoerd op basis van de resultaten in de cache van de oorspronkelijke query. In andere contexten, zoals LINQ naar SQL, is dergelijke caching niet vereist.
De code compileren
Maak een Visual Basic-consoletoepassingsproject met een Imports
instructie voor de System.Linq-naamruimte.