如何加快循环?是否有一个类可以替换多个术语?循环:varpattern=_dict[key];之前的字符串;做{之前=模式;foreach(varpairin_dict)if(key!=pair.Key)pattern=pattern.Replace(string.Concat("{",pair.Key,"}"),string.Concat("(",pair.Value,")"));}while(模式!=之前);返回模式;它只是在一堆键上重复查找和替换。字典只是。我可以看到2个改进。每次我们执行pattern.Replace时,它??都会再次从字符串的开头搜索。如果它命中第一个{,它只会查看匹配键列表(可能使用二进制搜索),并替换适当的键,这会更好。pattern!=beforebitpattern!=before是我检查迭代期间是否有任何替换的方式。如果pattern.Replace函数返回实际发生的实际替换次数,我不需要这个。但是......我真的不想写一个做这一切的非常讨厌的东西。这一定是相当普遍的情况吧?有现成的解决方案吗?全班感谢ElianEbbing和ChrisWue。类FlexDict:IEnumerable{privateDictionary_dict=newDictionary();privatestaticreadonlyRegex_re=newRegex(@"{([_a-z][_a-z0-9-]*)}",RegexOptions.Compiled|RegexOptions.IgnoreCase);publicvoidAdd(stringkey,stringpattern){_dict[key]=pattern;}publicstringExpand(stringpattern){pattern=_re.Replace(pattern,match=>{stringkey=match.Groups[1].Value;if(_dict.ContainsKey(key))return"("+Expand(_dict[key])+")";返回match.Value;});返回模式;}publicstringthis[stringkey]{get{returnExpand(_dict[key]);}}publicIEnumeratorGetEnumerator(){foreach(varpin_dict)yieldreturnnewKeyValuePair(p.Key,this[p.Key]);}IEnumeratorIEnumerable.GetEnumerator(){返回GetEnumerator();}}示例用法classProgram{staticvoidMain(string[]args){varflex=newFlexDict{{"h",@"[0-9a-f]"},{"nonascii",@"[200-377]"},{"unicode",@"\{h}{1,6}(rn|[trnf])?”},{“escape”,@“{unicode}|\[^rnf0-9a-f]”},{“nmstart”,@“[_a-z]|{nonascii}|{escape}”},{"nmchar",@"[_a-z0-9-]|{nonascii}|{escape}"},{"string1",@"""([^nrf\""]|\{nl}|{escape})*"""},{"string2",@"'([^nrf\']|\{nl}|{escape})*'"},{"badstring1",@"""([^nrf\""]|\{nl}|{escape})*\?"},{"badstring2",@"'([^nrf\']|\{nl}|{escape})*\?"},{"badcomment1",@"/*[^*]**+([^/*][^*]**+)*"},{"badcomment2",@"/*[^*]*(*+[^/*][^*]*)*"},{"baduri1",@"url({w}([!#$%&*-[]-~]|{nonascii}|{escape})*{w}"},{"baduri2",@"url({w}{string}{w}"},{"baduri3",@"url({w}{badstring}"},{"comment",@"/*[^*]**+([^/*][^*]**+)*/"},{"ident",@"-?{nmstart}{nmchar}*"},{"名称",@"{nmchar}+"},{"数",@"[0-9]+|[0-9]*.[0-9]+"},{"string",@"{string1}|{string2}"},{"badstring",@"{badstring1}|{badstring2}"},{"badcomment",@"{badcomment1}|{badcomment2}"},{"baduri",@"{baduri1}|{baduri2}|{baduri3}"},{"url",@"([!#$%&*-~]|{nonascii}|{escape})*"},{"s",@"[trnf]+"},{"w",@"{s}?"},{"nl",@"n|rn|r|f"},{"A",@"a|\0{0,4}(41|61)(rn|[trnf])?"},{"C",@"c|\0{0,4}(43|63)(rn|[trnf])?"},{"D",@"d|\0{0,4}(44|64)(rn|[trnf])?"},{"E",@"e|\0{0,4}(45|65)(rn|[trnf])?"},{"G",@"g|\0{0,4}(47|67)(rn|[trnf])?|\g"},{"H",@"h|\0{0,4}(48|68)(rn|[trnf])?|\h"},{"我",@"i|\0{0,4}(49|69)(rn|[trnf])?|\i"},{"K",@"k|\0{0,4}(4b|6b)(rn|[trnf])?|\k"},{"L",@"l|\0{0,4}(4c|6c)(rn|[trnf])?|\l"},{"M",@"m|\0{0,4}(4d|6d)(rn|[trnf])?|\m"},{"N",@"n|\0{0,4}(4e|6e)(rn|[trnf])?|\n"},{"O",@"o|\0{0,4}(4f|6f)(rn|[trnf])?|\o"},{"P",@"p|\0{0,4}(50|70)(rn|[trnf])?|\p"},{"R",@"r|\0{0,4}(52|72)(rn|[trnf])?|\r"},{"S",@"s|\0{0,4}(53|73)(rn|[trnf])?|\s"},{"T",@"t|\0{0,4}(54|74)(rn|[trnf])?|\t"},{"U",@"u|\0{0,4}(55|75)(rn|[trnf])?|\u"},{"X",@"x|\0{0,4}(58|78)(rn|[trnf])?|\x"},{"Z",@"z|\0{0,4}(5a|7a)(rn|[trnf])?|\z"},{"Z",@"z|\0{0,4}(5a|7a)(rn|[trnf])?|\z"},{"CDO",@""},{"INCLUDES",@"~="},{"DASHMATCH",@"|="},{"STRING",@"{string}"},{"BAD_STRING",@"{badstring}"},{"IDENT",@"{ident}"},{"HASH",@"#{name}"},{"IMPORT_SYM",@"@{I}{M}{P}{O}{R}{T}"},{"PAGE_SYM",@"@{P}{A}{G}{E}"},{"MEDIA_SYM",@"@{M}{E}{D}{I}{A}"},{"CHARSET_SYM",@"@charsetb"},{"IMPORTANT_SYM",@"!({w}|{评论})*{I}{M}{P}{O}{R}{T}{A}{N}{T}"},{"EMS",@"{num}{E}{M}"},{"EXS",@"{num}{E}{X}"},{"长度",@"{num}({P}{X}|{C}{M}|{M{M}|{I}{N}|{P}{T}|{P}{C})"},{"角度",@"{num}({D}{E}{G}|{R}{A}{D}|{G}{R}{A}{D})"},{"TIME",@"{num}({M}{S}|{S})"},{"PERCENTAGE",@"{num}%"},{"NUMBER",@"{num}"},{"URI",@"{U}{R}{L}({w}{string}{w})|{U}{R}{L}({w}{url}{w})"},{"BAD_URI",@"{baduri}"},{"FUNCTION",@"{ident}("},};vartestStrings=new[]{@"""str"",@"'str'","5","5.","5.0","a","alpha","url(hello)","url("hello")","url("blah)",@"g",@"/*comment*/",@"/**/",@"",@"~=","|=",@"#hash","@import","@page","@media","@charset","!/*iehack*/important"};foreach(flex中的变量对){Console.WriteLine("{0}nt{1}n",pair.Key,pair.Value);}varsw=Stopwatch.StartNew();foreach(varstrintestStrings){Console.WriteLine("{0}匹配:",str);foreach(varpairinflex){if(Regex.IsMatch(str,"^("+pair.Value+")$",RegexOptions.IgnoreCase|RegexOptions.ExplicitCapture))Console.WriteLine("{0}",对。钥匙);}}Console.WriteLine("nRanin{0}ms",sw.ElapsedMilliseconds);控制台.ReadLine();目的是构建复杂的正则表达式,这些正则表达式也可以相互扩展也就是说,我正在尝试实现css规范。我认为如果您使用正则表达式查找{foo}的任何出现,然后使用MatchEvaluator替换{foo}如果foo恰好是字典中的键,会更快。我目前没有visualstudio,但我想这在功能上与您的代码示例相同:varpattern=_dict[key];boolisChanged=false;做{isChanged=false;pattern=Regex.Replace(pattern,"{([^}]+)}",match=>{字符串matchKey=match.Groups[1].Value;if(matchKey!=key&&_dict.ContainsKey(matchKey)){isChanged=true;return"("+_dict[matchKey]+")";}returnmatch.Value;});}while(isChanged);请问为什么需要do/while循环?字典中键的值是否可以再次包含必须替换的{placeholders}?你能确定你不会陷入无限循环,其中键“A”包含“Blahblah{B}”而键“B”包含“Blahblah{A}”吗?编辑:进一步的改进是:你最终得到一个O(n)算法,其中n是输出的大小,所以你不能做得比这更好。您应该能够使用正则表达式来查找匹配项。然后您还可以使用快速查找字典,而不是仅仅将其用作列表。varpattern=_dict[key];布尔替换=假;do{pattern=Regex.Replace(pattern,@"{([^}]+)}",m=>{stringk=m.Groups[1].Value;stringvalue;if(k!=key&&_dict.TryGetValue(k,outvalue){replaced=true;return"("+value+")";}else{return"{"+k+"}";}});}while(replaced);返回模式;您可以实现以下算法:在源字符串中搜索{将所有内容复制到{StringBuilderfindmatch}(搜索是从最后喜欢的位置开始的)replace{and}将中间的值与字典中的键进行比较如果结束sourcestring未到,转到步骤1可以使用PLINQ吗?有点像:以上是C#学习教程:如何加速循环?有没有一个类可以代替多个Aterm?所有内容共享,如果对你有用,需要多了解C#学习教程,希望大家多多关注—varkeys=dict.KeyCollection.Where(k=>k!=key);boolreplacementMade=keys.Any();foreach(varkinkeys.AsParallel(),()=>{替换码})本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: