Delen via


Procedure: Query uitvoeren op zinnen die een opgegeven set woorden (LINQ) bevatten (Visual Basic)

In dit voorbeeld ziet u hoe u zinnen vindt in een tekstbestand dat overeenkomsten bevat voor elk van een opgegeven set woorden. Hoewel de matrix met zoektermen in dit voorbeeld in code is vastgelegd, kan deze ook dynamisch worden ingevuld tijdens runtime. In dit voorbeeld retourneert de query de zinnen die de woorden 'Historisch', 'gegevens' en 'geïntegreerd' bevatten.

Opmerking

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

De query werkt door eerst de tekst op te splitsen in zinnen en vervolgens de zinnen te splitsen in een matrix met tekenreeksen die elk woord bevatten. Voor elk van deze matrices verwijdert de Distinct methode alle dubbele woorden en voert de query vervolgens een Intersect bewerking uit op de woordmatrix en de wordsToMatch matrix. Als het aantal snijpunten hetzelfde is als het aantal van de wordsToMatch matrix, zijn alle woorden gevonden in de woorden en wordt de oorspronkelijke zin geretourneerd.

In de aanroep naar Splitworden de interpunctiemarkeringen gebruikt als scheidingstekens om ze uit de tekenreeks te verwijderen. Als u dit niet hebt gedaan, kunt u bijvoorbeeld een tekenreeks 'Historisch' hebben die niet overeenkomt met 'Historisch' in de wordsToMatch matrix. Mogelijk moet u extra scheidingstekens gebruiken, afhankelijk van de typen interpunctie in de brontekst.

De code compileren

Maak een Visual Basic-consoletoepassingsproject met een Imports instructie voor de System.Linq-naamruimte.

Zie ook