列表<string> removeat

时间:2018-09-11 11:56:34

标签: c#

我要删除长度小于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

2 个答案:

答案 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;
}