C# 迭代foreach循环-处理c需要很长时间#

C# 迭代foreach循环-处理c需要很长时间#,c#,regex,C#,Regex,我试图迭代列表中包含的项,并使用正则表达式查找匹配的关键字(~100k)。有人能推荐一个好的方法来解决与循环这个庞大的项目列表相关的性能问题吗 List<string> words = new List<string> { "a","b",....~100k Items}; string pattern = @"\b(" + String.Join("|", words) + @")\b"; Regex r = new Regex(pattern, RegexOptio

我试图迭代列表中包含的项,并使用正则表达式查找匹配的关键字(~100k)。有人能推荐一个好的方法来解决与循环这个庞大的项目列表相关的性能问题吗

List<string> words = new List<string> { "a","b",....~100k Items};

string pattern = @"\b(" + String.Join("|", words) + @")\b";
Regex r = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace | RgexOptions.Multiline | RegexOptions.Compiled);
MatchCollection mc = r.Matches(TextBox1.Text);

foreach (Match m in mc) {
  Label1.Text = r.Replace(TextBox1.Text, @"<b>$1</b>");
}
List words=新列表{“a”、“b”…~100k项};
字符串模式=@“\b(“+string.Join(|)”,单词)+@”)\b”;
Regex r=new Regex(pattern,RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace | RgexOptions.Multiline | RegexOptions.Compiled);
MatchCollection mc=r.Matches(TextBox1.Text);
foreach(在mc中匹配m){
Label1.Text=r.Replace(TextBox1.Text,@“$1”);
}

提前感谢您的帮助

您的foreach与match集合一样完全不必要,请注意,您从未在foreach中使用变量
m
。您可以将代码简化为

List<string> words = new List<string> { "a","b",....~100k Items};

string pattern = @"\b(" + String.Join("|", words) + @")\b";
Regex r = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace | RgexOptions.Multiline | RegexOptions.Compiled);

Label1.Text = r.Replace(TextBox1.Text, @"<b>$1</b>");

您的foreach与match集合一样完全不重要,请注意,您从未在foreach中使用变量
m
。您可以将代码简化为

List<string> words = new List<string> { "a","b",....~100k Items};

string pattern = @"\b(" + String.Join("|", words) + @")\b";
Regex r = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace | RgexOptions.Multiline | RegexOptions.Compiled);

Label1.Text = r.Replace(TextBox1.Text, @"<b>$1</b>");

您的foreach与match集合一样完全不重要,请注意,您从未在foreach中使用变量
m
。您可以将代码简化为

List<string> words = new List<string> { "a","b",....~100k Items};

string pattern = @"\b(" + String.Join("|", words) + @")\b";
Regex r = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace | RgexOptions.Multiline | RegexOptions.Compiled);

Label1.Text = r.Replace(TextBox1.Text, @"<b>$1</b>");

您的foreach与match集合一样完全不重要,请注意,您从未在foreach中使用变量
m
。您可以将代码简化为

List<string> words = new List<string> { "a","b",....~100k Items};

string pattern = @"\b(" + String.Join("|", words) + @")\b";
Regex r = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace | RgexOptions.Multiline | RegexOptions.Compiled);

Label1.Text = r.Replace(TextBox1.Text, @"<b>$1</b>");

您是否正在检查文本字符串中的特定单词是否与100K列表中的单词匹配

如果是这样,我会改变方法

  • 步骤1:创建一个trie,并使用它来存储所有100K单词。trie基本上是一个多维节点数组,其中每个节点是一个字母和一个节点数组(用于单词中的下一个字母)。您可以在谷歌上搜索或查看wiki以获取有关trie数据结构的更多信息。要获得一个好的但效率较低的解决方案,请使用字符串的
    哈希集

  • 步骤2:从字符串中取出单个单词,并检查它们是否存在于trie/hashset中。根据字符串的格式,可以在空白处拆分,也可以使用使用单词边界(\b)的简单正则表达式

创建trie/hashset将花费一点时间,但在程序期间只需执行一次。之后,所有的搜索都会非常快

不过,可以肯定的是,使用具有如此多字符的正则表达式将是一个缓慢的过程

例如,使用
HashSet
并对空格进行拆分:

HashSet<string> allWords = new HashSet<string>();
for(int i = 0; i < words.Length; i++) {
    allWords.Add(words[i]);
}

string[] wordsInText = TextBox1.Text.Split(null as string[], StringSplitOptions.RemoveEmptyEntries);
for(int i = 0; i < wordsInText.Length; i++) {
    if(allWords.Contains(wordsInText[i])) {
        Label1.Text = @"<b>" + wordsInText[i] + @"</b>";
        break;
    }
}
HashSet allWords=new HashSet();
for(int i=0;i
是否检查文本字符串中的特定单词是否与100K列表中的单词匹配

如果是这样,我会改变方法

  • 步骤1:创建一个trie,并使用它来存储所有100K单词。trie基本上是一个多维节点数组,其中每个节点是一个字母和一个节点数组(用于单词中的下一个字母)。您可以在谷歌上搜索或查看wiki以获取有关trie数据结构的更多信息。要获得一个好的但效率较低的解决方案,请使用字符串的
    哈希集

  • 步骤2:从字符串中取出单个单词,并检查它们是否存在于trie/hashset中。根据字符串的格式,可以在空白处拆分,也可以使用使用单词边界(\b)的简单正则表达式

创建trie/hashset将花费一点时间,但在程序期间只需执行一次。之后,所有的搜索都会非常快

不过,可以肯定的是,使用具有如此多字符的正则表达式将是一个缓慢的过程

例如,使用
HashSet
并对空格进行拆分:

HashSet<string> allWords = new HashSet<string>();
for(int i = 0; i < words.Length; i++) {
    allWords.Add(words[i]);
}

string[] wordsInText = TextBox1.Text.Split(null as string[], StringSplitOptions.RemoveEmptyEntries);
for(int i = 0; i < wordsInText.Length; i++) {
    if(allWords.Contains(wordsInText[i])) {
        Label1.Text = @"<b>" + wordsInText[i] + @"</b>";
        break;
    }
}
HashSet allWords=new HashSet();
for(int i=0;i
是否检查文本字符串中的特定单词是否与100K列表中的单词匹配

如果是这样,我会改变方法

  • 步骤1:创建一个trie,并使用它来存储所有100K单词。trie基本上是一个多维节点数组,其中每个节点是一个字母和一个节点数组(用于单词中的下一个字母)。您可以在谷歌上搜索或查看wiki以获取有关trie数据结构的更多信息。要获得一个好的但效率较低的解决方案,请使用字符串的
    哈希集

  • 步骤2:从字符串中取出单个单词,并检查它们是否存在于trie/hashset中。根据字符串的格式,可以在空白处拆分,也可以使用使用单词边界(\b)的简单正则表达式

创建trie/hashset将花费一点时间,但在程序期间只需执行一次。之后,所有的搜索都会非常快

不过,可以肯定的是,使用具有如此多字符的正则表达式将是一个缓慢的过程

例如,使用
HashSet
并对空格进行拆分:

HashSet<string> allWords = new HashSet<string>();
for(int i = 0; i < words.Length; i++) {
    allWords.Add(words[i]);
}

string[] wordsInText = TextBox1.Text.Split(null as string[], StringSplitOptions.RemoveEmptyEntries);
for(int i = 0; i < wordsInText.Length; i++) {
    if(allWords.Contains(wordsInText[i])) {
        Label1.Text = @"<b>" + wordsInText[i] + @"</b>";
        break;
    }
}
HashSet allWords=new HashSet();
for(int i=0;i