Share via


Cómo: Realizar un recuento de las repeticiones de una palabra en una cadena (LINQ)

Actualización: noviembre 2007

En este ejemplo se muestra cómo utilizar una consulta LINQ para contar el número de veces que aparece una palabra especificada en una cadena. Observe que, para realizar el recuento, primero se llama al método Split para crear una matriz de palabras. La ejecución del método Split afecta al rendimiento. Si la única operación que se va a realizar con la cadena es contar las palabras, debería considerar el uso del método Matches o IndexOf en su lugar. Sin embargo, si el rendimiento no es un problema crítico o si ya ha dividido la frase para realizar otros tipos de consultas con ella, sería sensato utilizar LINQ para contar las palabras o las frases también.

Ejemplo

Class CountWords

    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."

        Dim searchTerm As String = "data"

        ' Convert the string into an array of words.
        Dim dataSource As String() = text.Split(New Char() {" ", ",", ".", ";", ":"}, _
                                                 StringSplitOptions.RemoveEmptyEntries)

        ' Create and execute the query. It executes immediately 
        ' because a singleton value is produced.
        ' Use ToLower to match "data" and "Data" 
        Dim matchQuery = From word In dataSource _
                      Where word.ToLowerInvariant() = searchTerm.ToLowerInvariant() _
                      Select word

        ' Count the matches.
        Dim count As Integer = matchQuery.Count()
        Console.WriteLine(count & " occurrence(s) of the search term """ & _
                          searchTerm & """ were found.")

        ' Keep console window open in debug mode.
        Console.WriteLine("Press any key to exit.")
        Console.ReadKey()
    End Sub
End Class
' Output:
' 3 occurrence(s) of the search term "data" were found.
class CountWords
{
    static void Main()
    {
        string text = @"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.";

        string searchTerm = "data";

        //Convert the string into an array of words
        string[] source = text.Split(new char[] { '.', '?', '!', ' ', ';', ':', ',' }, StringSplitOptions.RemoveEmptyEntries);

        // Create and execute the query. It executes immediately 
        // because a singleton value is produced.
        // Use ToLowerInvariant to match "data" and "Data" 
        var matchQuery = from word in source
                         where word.ToLowerInvariant() == searchTerm.ToLowerInvariant()
                         select word;

        // Count the matches.
        int wordCount = matchQuery.Count();
        Console.WriteLine("{0} occurrences(s) of the search term \"{1}\" were found.", wordCount, searchTerm);

        // Keep console window open in debug mode
        Console.WriteLine("Press any key to exit");
        Console.ReadKey();
    }
}
/* Output:
   3 occurrences(s) of the search term "data" were found.
*/

Compilar el código

  • Cree un proyecto de Visual Studio orientado a .NET Framework versión 3.5. De manera predeterminada, el proyecto incluye una referencia a System.Core.dll y una directiva using (C#) o una instrucción Imports (Visual Basic) para el espacio de nombres System.Linq. En los proyectos de C#, agregue una directiva using para el espacio de nombres System.IO.

  • Copie este código en el proyecto.

  • Presione F5 para compilar y ejecutar el programa.

  • Presione cualquier tecla para salir de la ventana de consola.

Vea también

Conceptos

LINQ y cadenas