Udostępnij za pośrednictwem


Porady: wykonywanie zapytań dotyczących zdań zawierających określony zestaw wyrazów (LINQ) (Visual Basic)

W tym przykładzie pokazano, jak znaleźć zdania w pliku tekstowym zawierającym dopasowania dla każdego z określonych zestawów wyrazów. Mimo że tablica terminów wyszukiwania jest trwale zakodowana w tym przykładzie, może być również wypełniana dynamicznie w czasie wykonywania. W tym przykładzie zapytanie zwraca zdania zawierające słowa "Historycznie", "dane" i "zintegrowane".

Przykład

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

Zapytanie działa przez najpierw podzielenie tekstu na zdania, a następnie podzielenie zdań na tablicę ciągów, które przechowują poszczególne wyrazy. Dla każdej z tych tablic metoda usuwa wszystkie zduplikowane wyrazy Distinct , a następnie zapytanie wykonuje operację Intersect na tablicy wyrazów i tablicy wordsToMatch . Jeśli liczba przecięcia jest taka sama jak liczba wordsToMatch tablicy, wszystkie wyrazy zostały znalezione w słowach i zwracane jest oryginalne zdanie.

W wywołaniu metody Splitznaki interpunkcyjne są używane jako separatory w celu usunięcia ich z ciągu. Jeśli tego nie zrobiono, na przykład możesz mieć ciąg "Historycznie", który nie pasuje do "Historycznie" w tablicy wordsToMatch . Może być konieczne użycie dodatkowych separatorów, w zależności od typów interpunkcji znalezionych w tekście źródłowym.

Kompilowanie kodu

Utwórz projekt aplikacji konsolowej języka Visual Basic z instrukcją Imports dla przestrzeni nazw System.Linq.

Zobacz też