如果我得到关于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
。
答案 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);
}
}
这对你有用......