首页 > 解决方案 > 计算“名称”和“姓氏”在 c# Visual Studio 中的文本中出现的次数

问题描述

我希望能够用 Visual Studio 在 C# 中计算姓名和姓氏。目前我只能在文本中搜索 1 个单词。我正在使用 .NET 5.0(当前)创建控制台应用程序。

(当输入为“Harry”时,它计算找到了多少次 Harry,当输入为“Harry Potter”时,即使文本中多次出现“Harry Potter”,它也始终计为 0。)

我一直在谷歌上寻找答案,但只能找到如何计算 1 个单词。

这是我当前的代码:

using System;
using System.IO;

namespace Harry
{
    class Program
    {
        static void Main(string[] args)
        {
            string input = Console.ReadLine();
            StreamReader stream = File.OpenText("Harry Potter and the Sorcerer.txt");
            string text = stream.ReadToEnd();

            string woord = "";
            int count = 0;

            foreach (var item in text)
            {
                if (Char.IsLetter(item))
                {
                    woord = woord + item;
                }
                else
                {
                    if(woord == input)
                    {
                        count++; 
                    }
                    woord = "";
                }
            }
            Console.Write(input + ": " + count + " occurrences");
        }
    }
}

标签: c#

解决方案


也许,符合 Auditive 的建议:

int count = System.Text.RegularExpressions.Regex.Matches(text, input, RegexOptions.IgnoreCase).Count

如果您仍然很矮,请更改输入,使其具有值harry\s+potter\s+意思是“至少一个空格”,以防万一您的文本有harrySPACESPACEpotter..(欢迎来到正则表达式的奇妙、神秘的世界)

如果您仍然很矮,我认为您的文档中可能存在拼写错误!

--

如果你想数哈利或波特,你可以将你的正则表达式调整为harry|potter..

--

存在解决此挑战的其他方法,一种典型的方法是检查通过拆分获得的数组的长度:

int count = text.Split(input).Length - 1;

如果有 5 个 Harry Potters,您将从 Split 中得到一个 6 长的数组,因此是 -1。不过,它可能会占用更多资源;如果您追求尽可能低的 CPU 消耗,您可能会看到类似以下内容:

int count=0;
for(int idx = text.IndexOf(input); idx > -1; count++, idx = text.IndexOf(input, idx+input.Length));

这会设置一个用于计数的变量,然后重复使用 IndexOf 直到它返回 -1。每次第一次之后,IndexOf 都从上次找到的字符串的末尾开始。没有循环体,一切都发生在标题中。

值得指出的是,这些都不是不区分大小写的,但可以通过更多的工作来做到这一点


推荐阅读