我要删除长度小于50的列表中的字符串:
example@gmail.com:123456789 <---- 17
example1111@gmail.com:123456789 <---- 21
example1@gmail.com:123456789 <---- 18
example111@gmail.com:123456789 <---- 20
“:”后的字符串不计算在内。
这是我的代码:
if (emaillower != 0) // emaillower = the length
{
string pattern = "[a-zA-Z0-9@.]+[:]";
for (int i = 0; i < OldCombo.Count; i++)
{
Match m = Regex.Match(OldCombo[i], pattern);
if (m.Success && m.Length <= emaillower)
OldCombo.RemoveAt(i);
}
}
foreach(string s in OldCombo)
Console.WriteLine(s);
当前输出:
example1111@gmail.com:123456789
example:111@gmail.com:123456789
想要的输出:
everything needs to be remove
答案 0 :(得分:3)
如果您修改要迭代的集合,那将是一段糟糕的时光。
如果您有此列表:
0: Apple
1: Banana
2: Pear
3: Grape
如果您删除位置1处的项目,则结果为:
0: Apple
1: Pear
2: Grape
如果您随后删除位置2处的物品(要删除梨子),则实际上是删除了Grape,因为一切都移动了。
我的建议是反转循环,因此倒数。
for (int i = OldCombo.Count - 1; i >= 0; i--)
{
Match m = Regex.Match(OldCombo[i], pattern);
if (m.Success && m.Length <= emaillower)
OldCombo.RemoveAt(i);
}
这意味着,如果删除某个项目,则不会影响该项目在列表中的其他位置。
解决此问题后,您需要查看m
的值,以确保正则表达式返回期望的字符串部分。
我可以看到,如果您运行它,m
会以匹配项的形式返回,“ example@gmail.com:123456789”会给出 example@gmail.com:,这样只要emaillower
正确就可以。
为清楚起见,我建议将m.Length
更改为m.Value.Length
,即使m.Length
似乎可行。
如果您想进一步提高效率,可以考虑使用LINQ,它可以在一行中完成整个工作-减去正则表达式正在执行的隐式电子邮件验证。
var results = OldCombo.Where(c => c.Substring(0, c.IndexOf(':')).Length >= 50);
您还可以在查询中构建正则表达式:
var results = OldCombo.Where(c => Regex.Match(c, pattern).Success && c.Substring(0, c.IndexOf(':')).Length >= 50);
答案 1 :(得分:2)
您还可以这样使用RemoveAll方法:
private void DoStuff ()
{
if (emaillower != 0) // emaillower = the length
{
OldoCombo.RemoveAll (x => Match(x, emaillower ));
}
foreach(string s in OldCombo)
Console.WriteLine(s);
}
private bool Match (string value, int maxLength)
{
string pattern = "[a-zA-Z0-9@.]+[:]";;
Match match = Regex.Match(value, pattern);
return match.Success && match.Length < maxLength;
}