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.