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

时间:2017-01-03 03:37:57

标签: 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";

修改

由于我的优先考虑是尽可能快地进行此替换,我已经尝试比较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

3 个答案:

答案 0 :(得分:1)

没有一般快速和正确的方法,因为它取决于太多因素。

List<string> strList = Enumerable.Range(1, 2000).Select(i => "a" + i).ToList();
string inputStr = "a1 a5 a80 a80 m124 a34 a300 e12 s00";

string result = string.Join(" ", inputStr.Split(' ').Except(strList)); // "m124 e12 s00"

大部分时间都用在.Except LINQ扩展中创建一个Set,因此只能在前面创建一次Set来替换多个字符串:

var strSet = new HashSet<string>(Enumerable.Range(1, 2000).Select(i => "a" + i));

var result1 = string.Join(" ", inputStr1.Split(' ').Where(s => !strSet.Contains(s)));

var result2 = string.Join(" ", inputStr2.Split(' ').Where(s => !strSet.Contains(s)));

答案 1 :(得分:1)

我建议使用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();

答案 2 :(得分:0)

您可以使用以下代码执行此操作...

List<string> strListNew = new List<string>();
foeach(var item in strList){
  if ( /*your condition in here*/ )
  {
    strListNew.Add(""); 
  }
  else{
    strListNew.Add(item);
  } 
}

这对你有用......