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.