查找一个字符串(或子字符串)在一个大字符串中出现多少次的最佳方法是c#

查找一个字符串(或子字符串)在一个大字符串中出现多少次的最佳方法是c#,c#,string,C#,String,上学的时候我必须做作业,我已经交了作业,但是我写的代码太糟糕了,我不喜欢我最后得到的东西。所以,我很好奇,在C#中,解决以下问题的最佳方法是什么: “//4《爱丽丝漫游奇境记》中的“女王”出现了多少次?写一些代码来计算它们。” 指向书本的链接(粘贴箱): 我的代码(pastebin): 请在写答案时忽略我的代码。另外,解释你的代码是做什么的,以及为什么你认为它是最好的解决方案。 “女王”一词在书中出现的次数应该是76次。我不会发布完整的代码,因为我认为作为练习尝试这一点对您很有用,但我个人会寻找

上学的时候我必须做作业,我已经交了作业,但是我写的代码太糟糕了,我不喜欢我最后得到的东西。所以,我很好奇,在C#中,解决以下问题的最佳方法是什么:

“//4《爱丽丝漫游奇境记》中的“女王”出现了多少次?写一些代码来计算它们。”

指向书本的链接(粘贴箱):

我的代码(pastebin):

请在写答案时忽略我的代码。另外,解释你的代码是做什么的,以及为什么你认为它是最好的解决方案。
“女王”一词在书中出现的次数应该是76次。

我不会发布完整的代码,因为我认为作为练习尝试这一点对您很有用,但我个人会寻找一个解决方案,解决以过载为起点的问题

比如(注意:故意不正确):


您可以编写一个字符串扩展方法来拆分多个字符

public static string[] Split(this string s, string separator)
{
    return s.Split(new string[] { separator }, StringSplitOptions.None);
}
..只需使用正在搜索的字符串作为specrator,然后结果是数组的长度-1

string s = "How now brown cow";
string searchS = "ow";
int count = s.split( seacrchS ).Length- 1;
split返回的实际数组是

["H"," n"," b","n ","c"]

而扩展方法在将来也会派上用场。

最短的编写方法。就是使用正则表达式。它将为您找到匹配项。记下计数就行了。此外,regex还具有忽略大小写选项,因此您不必对大字符串使用
ToLower
。所以在你读了文件之后

string aliceFile = Path.Combine(Environment.CurrentDirectory, "bestanden\\alice_in_wonderland.txt");
string text = File.ReadAllText(aliceFile);

Regex r = new Regex("queen", RegexOptions.IgnoreCase);
var count = r.Matches(input).Count;
另外,因为输入非常大,但模式很简单,所以可以使用
RegexOptions.Compiled
来加快速度

Regex r = new Regex("queen", RegexOptions.IgnoreCase | RegexOptions.Compiled);
var count = r.Matches(input).Count;

也可以使用正则表达式:

 string s = "Hello my baby, Hello my honey, Hello my ragtime gal";
 int count = Regex.Matches(s, "Hello").Count;

或者你可以用linq做同样的事情

string words = "Hi, Hi, Hello, Hi, Hello";  //"hello1 hello2 hello546 helloasdf";
var countList = words.Split(new[] { " " }, StringSplitOptions.None);
int count = countList.Where(s => s.Contains("Hi")).Count();

你也许应该退房。它是专门为检查代码而创建的,而堆栈溢出的设计更多的是为了帮助排除损坏的代码。查看可能的重复代码,但不要说你的优点度量是什么,而是询问“最佳”方法。最短代码?最容易理解?面对变化最灵活的方法是什么?使用最少内存的代码?单程跑最快的?如果允许预计算,则速度最快?这些和许多更多的东西都是在设计现实世界代码时必须考虑的可能的度量。@ USSR330894点是最好的解决方案取决于实际需求。Eric列出的所有内容基本上都是同样有效的,因此你会为你问的每个人都得到不同的“最佳”答案,这最终并没有太大帮助。比现在的bron cow更和谐;)还有非常好的代码。我可能会添加另一个扩展方法。。。计算发生率并利用这一点。
string words = "Hi, Hi, Hello, Hi, Hello";  //"hello1 hello2 hello546 helloasdf";
var countList = words.Split(new[] { " " }, StringSplitOptions.None);
int count = countList.Where(s => s.Contains("Hi")).Count();