Sdílet prostřednictvím


Postupy: Dotazování na věty obsahující zadanou sadu slov (LINQ) (Visual Basic)

Tento příklad ukazuje, jak najít věty v textovém souboru, který obsahuje shody pro každou zadanou sadu slov. I když je pole hledaných termínů pevně zakódované v tomto příkladu, může se také dynamicky za běhu naplnit. V tomto příkladu dotaz vrátí věty, které obsahují slova "Historicky", "data" a "integrovaná".

Příklad

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

Dotaz funguje tak, že nejprve rozdělí text na věty a potom rozdělí věty do pole řetězců, které obsahují jednotlivá slova. U každé z těchto polí Distinct metoda odebere všechna duplicitní slova a potom dotaz provede Intersect operaci s polem slov a wordsToMatch polem. Pokud je počet průniku stejný jako počet wordsToMatch matice, všechna slova byla nalezena ve slovech a vrátí se původní věta.

Ve volání Splitse interpunkční znaménka používají jako oddělovače k jejich odebrání z řetězce. Pokud jste to neudělali, mohli byste mít například řetězec "Historicky", který by v wordsToMatch poli neodpovídal "Historicky". V závislosti na typech interpunkce nalezených ve zdrojovém textu možná budete muset použít další oddělovače.

Kompilace kódu

Vytvořte projekt konzolové aplikace jazyka Visual Basic s příkazem Imports pro obor názvů System.Linq.

Viz také