Partager via


Guide pratique pour rechercher des phrases qui contiennent un ensemble de mots spécifié (LINQ) (Visual Basic)

Cet exemple montre comment rechercher des phrases dans un fichier texte qui contiennent des correspondances pour chacun d’un ensemble de mots spécifié. Bien que le tableau de termes de recherche soit codé en dur dans cet exemple, il peut également être rempli dynamiquement au moment de l’exécution. Dans cet exemple, la requête retourne les phrases qui contiennent les mots « Historiquement », « données » et « intégrées ».

Exemple :

Class FindSentences

    Shared Sub Main()
        Dim text As String = "Historically, the world of data and the world of objects " &
        "have not been well integrated. Programmers work in C# or Visual Basic " &
        "and also in SQL or XQuery. On the one side are concepts such as classes, " &
        "objects, fields, inheritance, and .NET Framework APIs. On the other side " &
        "are tables, columns, rows, nodes, and separate languages for dealing with " &
        "them. Data types often require translation between the two worlds; there are " &
        "different standard functions. Because the object world has no notion of query, a " &
        "query can only be represented as a string without compile-time type checking or " &
        "IntelliSense support in the IDE. Transferring data from SQL tables or XML trees to " &
        "objects in memory is often tedious and error-prone."

        ' Split the text block into an array of sentences.
        Dim sentences As String() = text.Split(New Char() {".", "?", "!"})

        ' Define the search terms. This list could also be dynamically populated at run time
        Dim wordsToMatch As String() = {"Historically", "data", "integrated"}

        ' Find sentences that contain all the terms in the wordsToMatch array
        ' Note that the number of terms to match is not specified at compile time
        Dim sentenceQuery = From sentence In sentences
                            Let w = sentence.Split(New Char() {" ", ",", ".", ";", ":"},
                                                   StringSplitOptions.RemoveEmptyEntries)
                            Where w.Distinct().Intersect(wordsToMatch).Count = wordsToMatch.Count()
                            Select sentence

        ' Execute the query
        For Each str As String In sentenceQuery
            Console.WriteLine(str)
        Next

        ' Keep console window open in debug mode.
        Console.WriteLine("Press any key to exit.")
        Console.ReadKey()
    End Sub

End Class
' Output:
' Historically, the world of data and the world of objects have not been well integrated

La requête fonctionne d’abord en fractionnant le texte en phrases, puis en fractionnant les phrases en un tableau de chaînes qui contiennent chaque mot. Pour chacun de ces tableaux, la Distinct méthode supprime tous les mots dupliqués, puis la requête effectue une Intersect opération sur le tableau de mots et le wordsToMatch tableau. Si le nombre de l’intersection est identique au nombre du wordsToMatch tableau, tous les mots ont été trouvés dans les mots et la phrase d’origine est retournée.

Dans l’appel à Split, les marques de ponctuation sont utilisées comme séparateurs pour les supprimer de la chaîne. Si vous ne l’avez pas fait, par exemple, vous pourriez avoir une chaîne « Historique », qui ne correspondrait pas à « Historique » dans le wordsToMatch tableau. Vous devrez peut-être utiliser des séparateurs supplémentaires, en fonction des types de ponctuation trouvés dans le texte source.

Compiler le code

Créez un projet d’application console Visual Basic, avec une Imports instruction pour l’espace de noms System.Linq.

Voir aussi