C# 为什么它不从列表中删除字符串,但它确实删除了一些内容

C# 为什么它不从列表中删除字符串,但它确实删除了一些内容,c#,list,loops,foreach,C#,List,Loops,Foreach,所以我不知道为什么它没有从网站列表中删除实际的字符串,这很奇怪,因为它确实从ProxyList中删除了 调试时,它会说它确实删除了一些内容,因为在运行webisteList.Removewebsite之后,websiteList.Count变得更低; 但它不会删除字符串,而是在同一个字符串中循环 foreach (var website in websiteList.ToArray()) { var webSplit = website.Split(')'); foreach

所以我不知道为什么它没有从网站列表中删除实际的字符串,这很奇怪,因为它确实从ProxyList中删除了

调试时,它会说它确实删除了一些内容,因为在运行webisteList.Removewebsite之后,websiteList.Count变得更低; 但它不会删除字符串,而是在同一个字符串中循环

foreach (var website in websiteList.ToArray())
{
    var webSplit = website.Split(')');

    foreach (var proxy in proxyList.ToArray())
    {
        if (proxyList.Count > 0)
        {
            if(websiteList.Count > 0)
            {
                var proxySplit = proxy.Split(':');
                int Port;
                bool convert = Int32.TryParse(proxySplit[1], out Port);

                if (this returns true)
                {
                    Console.WriteLine("Removing proxy");
                    proxyList.Remove(proxy);
                    websiteList.Remove(website);

                }
                if (this returns true)
                {
                    Console.WriteLine("Removing proxy");
                    proxyList.Remove(proxy);
                    websiteList.Remove(website);
                }
            }
        }
        else
            break;
    }
}

您重复从同一个proxyList中删除,即重复整个内部循环的次数与网站的次数相同。为什么这两个循环是嵌套的?这些网站似乎与代理无关。只有从网站中提取代理列表,嵌套才有意义

这两个列表是否应该具有相同的长度,并且具有属于同一索引的网站的代理?如果是这种情况,则使用for循环和按相反顺序循环,以避免弄乱索引

for (int i = websiteList.Count - 1; i >= 0; i--) {
    if (<condition>) {
        proxyList.RemoveAt(i);
        websiteList.RemoveAt(i);
    }
}
现在列表是list类型,包含网站和代理

您可以像以前一样使用for循环进行删除,也可以使用LINQ并创建一个只包含所需项目的新列表

websiteList = websiteList.Where(w => <condition using w.Site, w.Proxy, w.Port>).ToList();

注意:有一个类用于操作统一资源标识符。除此之外,它还可以提取端口号。考虑使用这个类而不是你自己的类。< /P>请发布你的实际代码。如果返回true,则C无效。如果您的问题是从websiteList中删除一个项并不同时从您正在迭代的临时数组对象中删除它,请返回并再次思考您首先调用ToArray的原因。也就是说,假设您知道调用ToArray的原因。无法修改循环中的列表。此外,假设您的“this returns true”位只是代理代码或其他内容,则在两个if块中都执行相同的操作。以这种方式重复代码是不好的。将这两个检查组合到一个if语句中,并使用| |来运行这两个检查。@EdPlunkett:ToArray很有意义,因为您无法修改正在枚举的集合。像这样,您枚举数组,但从列表中删除。@OlivierJacot Descombes我知道他为什么要调用数组。
websiteList = websiteList.Where(w => <condition using w.Site, w.Proxy, w.Port>).ToList();