【发布时间】:2017-05-17 02:33:41
【问题描述】:
如果我得到大约 2000 个字符串值的列表,我想知道什么是快速且正确的方法:
List<string> strList = new List<string>();
例如:
for (int i = 1; i <= 2000; i++)
{
strList.Add("a" + i);
}
如果找到相等的值,我想替换每个输入字符串:
string inputStr = "a1 a5 a80 a80 m124 a34 a300 e12 s00";
如果 strList 中有两千个值的任何单词,例如 if (strList.Any(inputStr.Contains)),那么我想要 inputStr.Replace 和 "" 空白空间,那么所需的输出应该是::
"m124 e12 s00";
编辑:
由于我的首要任务是尽可能快地进行此替换,因此我尝试比较以下 Slai 和 sxmlln 给定解决方案的ElapsedMilliseconds 结果。两者都完全回答了我的问题,结果排在第二位:
2000 个值:
string inputStr = "a1 a5 a80 a80 m124 a34 a300 e12 s00";
结果:
ISet<String> : time: [ 0 ] fast
List<string> : time: [ 5 ] slow
HashSet<string> : time: [ 1 ] average
有时等于相同的字符串和内容:
ISet<String> : time: [ 0 ] fast
List<string> : time: [ 5 ] slow
HashSet<string> : time: [ 0 ] fast
8000 个值:
string inputStr = "a1 a5 a80 a80 m124 a34 a4987 a300 e12 s00";
结果:
ISet<String> : time: [ 2 ] fast
List<string> : time: [ 5 ] slow
HashSet<string> time: [ 3 ] average
20000 个值:
string inputStr = "a1 a5 a80 a80 m124 a34 a4987 a17890 a300 e12 s00";
结果:
ISet<String> : [ 7 ] fast
List<string> : [ 12 ] average
HashSet<string> : [ 16 ] slow
200000 个值:
string inputStr1 = "a1 a5 a80 a80 m124 a34 a4987 a17890 a300 e12 s00 a123676";
结果:
ISet<String> : [ 105 ] fast
List<string> : [ 111 ] average
HashSet<string> : [ 142 ] slow
ISet<String> 总是小于List<string> 并且小于或等于HashSet<string>。并且List<string> 在更大数量的值之后变得比HashSet<string> 更快,但在这个特定数量之前它比HashSet<string> 更慢,ElapsedMilliseconds 结果。
【问题讨论】:
-
当然 2000 在处理 CPU 的处理能力时并没有那么多。但是对于具有真正庞大流程的此类事情,最好使用 StringBuilder ,因为它只会对字符串进行就地更改。在您的场景中,每次更改都会在 RAM 内存的新插槽中创建一个新字符串。
-
有趣.. List 方法是@Thili77 答案的修改版吗?以最小化内存分配的方式解析输入字符串通常应该是最快的,但是它的工作量太大并且必须根据频率调整解析方法。
-
@Slai 在大多数情况下它等于或接近 HashSet
ElapsedMilliseconds 结果至少它在快速/平均/慢速讲台上的相同位置。但我不能肯定地说,因为我在没有结果字符串的情况下使用这个过程,就像 Thili77 在 if 语句中添加条件 strList.Any(inputStr.Contains) 给出的那样,但是当我试图从 strListNew 中提取任何值,它是空的。所以说点什么,我对这个解决方案没有任何输出,只有实现,我不确定我做错了什么
标签: c# regex linq list replace