如何:对某个词在字符串中出现的次数进行计数 (LINQ)

此示例演示如何使用 LINQ 查询来计数指定词在字符串中的出现次数。 请注意,若要执行计数,请先调用 Split 方法来创建词数组。 Split 方法存在性能开销。如果对字符串执行的唯一操作是计数词,则应考虑改用 MatchesIndexOf 方法。 但是,如果性能不是关键问题,或者您已拆分句子以对其执行其他类型的查询,则使用 LINQ 来计数词或短语同样有意义。

示例

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 the query.  Use ToLowerInvariant to match "data" and "Data"  
        var matchQuery = from word in source
                         where word.ToLowerInvariant() == searchTerm.ToLowerInvariant()
                         select word;

        // Count the matches, which executes the query. 
        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.
*/

编译代码

  • 创建一个面向 .NET Framework 3.5 版的 Visual Studio 项目。 默认情况下,该项目具有对 System.Core.dll 的引用以及针对 System.Linq 命名空间的 using 指令 (C#) 或 Imports 语句 (Visual Basic)。 在 C# 项目中,添加 System.IO 命名空间的 using 指令。

  • 将此代码复制到您的项目。

  • 按 F5 编译并运行程序。

  • 按任意键退出控制台窗口。

请参见

概念

LINQ 和字符串