加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

什么是最有效(读取时间)字符串搜索方法? (C#)

发布时间:2020-12-15 20:04:19 所属栏目:百科 来源:网络整理
导读:我发现我的程序正在搜索许多冗长的字符串(20,000),试图找到一个特定的独特短语. 在C#中执行此操作的最有效方法是什么? 下面是当前的代码,它的工作原理如下: 搜索从startPos开始,因为目标区域从一开始就有所消除 它循环遍历字符串,在每一步它检查该点的子字
我发现我的程序正在搜索许多冗长的字符串(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).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读