Compartir a través de


Procedimiento para consultar oraciones que contienen un conjunto especificado de palabras (LINQ) (Visual Basic)

En este ejemplo se muestra cómo buscar oraciones en un archivo de texto que contenga coincidencias para cada uno de los conjuntos de palabras especificados. Aunque la matriz de términos de búsqueda está codificada de forma rígida en este ejemplo, también se puede rellenar dinámicamente en tiempo de ejecución. En este ejemplo, la consulta devuelve las oraciones que contienen las palabras "Históricamente", "datos" y "integrados".

Ejemplo

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

La consulta funciona dividiendo primero el texto en oraciones y, a continuación, dividiendo las oraciones en una matriz de cadenas que contienen cada palabra. Para cada una de estas matrices, el Distinct método quita todas las palabras duplicadas y, a continuación, la consulta realiza una Intersect operación en la matriz de palabras y la wordsToMatch matriz. Si el recuento de la intersección es igual que el recuento de la matriz wordsToMatch, se han encontrado todas las palabras y se devuelve la frase original.

En la llamada a Split, las marcas de puntuación se usan como separadores para quitarlas de la cadena. Si no lo hiciera podría tener, por ejemplo, una cadena "Historically", lo que no coincidiría con el "Historically" de la matriz wordsToMatch. Es posible que tenga que usar separadores adicionales, en función de los tipos de puntuación encontrados en el texto de origen.

Compilación del código

Cree un proyecto de aplicación de consola de Visual Basic con una instrucción Imports para el espacio de nombres System.Linq.

Consulte también