我发现我的程序正在搜索许多冗长的字符串(20,000),试图找到一个特定的独特短语.
在C#中执行此操作的最有效方法是什么?
下面是当前的代码,它的工作原理如下:
>搜索从startPos开始,因为目标区域从一开始就有所消除
>它循环遍历字符串,在每一步它检查该点的子字符串是否以startMatchString开头,这是指示已找到目标字符串的开头. (目标字符串varys的长度).
>从这里创建一个新的子串(切掉标记目标字符串开头的11个字符)并搜索endMatchString
我已经知道这是一个非常复杂且可能非常无效的算法.
有什么更好的方法来实现相同的结果?
string result = string.Empty; for (int i = startPos; i <= response.Length - 1; i++) { if (response.Substring(i).StartsWith(startMatchString)) { string result = response.Substring(i).Substring(11); for (int j = 0; j <= result.Length - 1; j++) { if (result.Substring(j).StartsWith(endMatchString)) { return result.Remove(j) } } } } return result;
解决方法
您可以使用String.IndexOf,但请确保使用StringComparison.Ordinal,否则可能会慢一个数量级.
private string Search2(int startPos,string startMatchString,string endMatchString,string response) { int startmarch = response.IndexOf(startMatchString,startPos,StringComparison.Ordinal); if (startmarch != -1) { startmarch += startMatchString.Length; int endMatch = response.IndexOf(endMatchString,startmarch,StringComparison.Ordinal); if (endMatch != -1) { return response.Substring(startmarch,endMatch - startmarch); } } return string.Empty; }
在大约183 KB文件的40%处搜索1000次字符串大约需要270毫秒.没有StringComparison.Ordinal,它花了大约2000毫秒.使用您的方法搜索一次花费超过60秒,因为它在每次迭代时创建一个新字符串(O(n)),使您的方法为O(n ^ 2).
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。