Note
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier les répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de changer de répertoire.
Cet exemple montre comment LINQ peut être utilisé pour effectuer des opérations de regroupement et de tri avancées sur des listes de fichiers ou de dossiers. Il montre également comment paginer la sortie dans la fenêtre de console à l’aide des méthodes Skip et Take.
Exemple :
La requête suivante montre comment regrouper le contenu d’une arborescence de répertoires spécifiée par l’extension de nom de fichier.
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
La sortie de ce programme peut être longue, en fonction des détails du système de fichiers local et de la valeur à laquelle le startFolder est défini. Pour activer l’affichage de tous les résultats, cet exemple montre comment parcourir les résultats. Les mêmes techniques peuvent être appliquées aux applications Windows et Web. Notez qu'une boucle imbriquée For Each est requise, car le code regroupe les éléments en un groupe. Il existe également une logique supplémentaire pour calculer la position actuelle dans la liste et permettre à l’utilisateur d’arrêter la pagination et de quitter le programme. Dans ce cas particulier, la requête de pagination est exécutée sur les résultats mis en cache de la requête d’origine. Dans d’autres contextes, tels que LINQ to SQL, cette mise en cache n’est pas nécessaire.
Compiler le code
Créez un projet d’application console Visual Basic, avec une Imports instruction pour l’espace de noms System.Linq.