c# - 如何替换字符串中找到的列表中的大量字符串值

标签 c# regex linq list replace

我想知道如果我得到大约 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";

编辑:

由于我的首要任务是尽可能快地进行替换,因此我尝试比较 ElapsedMilliseconds下面是 Slai 和 sxmlln 给出的解决方案的结果。两者都完全回答了我的问题,结果排名第二:

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结果。

最佳答案

我建议使用 Set。它们允许快速查找。

ISet<String> strSet = new HashSet<String>();  

for (int i = 1; i <= 2000; i++)
{
    strSet.Add("a" + i);
}

接下来,您可以将输入拆分为数组来进行检查(因为您的输入可以用空格拆分)。

string inputStr = "a1 a5 a80 a80 m124 a34 a300 e12 s00";
string[] inputs = inputStr.Split(' ');

最后,现在您循环输入并检查它们是否存在于Set中。如果没有,请将它们添加到您的结果中。

// this is from System.Text namespace
StringBuilder sbResult = new StringBuilder();
foreach (var input in inputs)
{ 
    if (!strSet.Contains(input))
        {
            sbResult.AppendFormat("{0} ", input);
        }
    }
}

string result = sbResult.ToString().Trim();

关于c# - 如何替换字符串中找到的列表中的大量字符串值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41436081/

相关文章:

c# - LINQ to SQL 中超时插入数百万条记录

c# - C#SmtpClient编程如何设置中文附件文件名?

c# - 从 Azure 网站 (xyz.com) 检索默认站点 URL (azurewebsites.net)

C#递归在返回后调用一次方法本身

python - 在python中用正则表达式拆分字符串的某些部分

.net - 正则表达式 单词边界混淆

java - 使用正则表达式提取和重新格式化时间戳是唯一的方法吗?

c# - 将两个列表对象组合成一个 List<string>

c# - 如何编写异步 LINQ 查询?

c# - asp.net c# 成员资格 : how to do a GetUsersInRoles (multiple roles)H