为什么不从列表中删除字符串,但它确实删除了一些东西

问题描述 投票:-4回答:1

所以我不知道它为什么不从WebsiteList中删除实际的字符串,这很奇怪,因为它确实从ProxyList中删除了。

调试时说它确实删除了一些东西,因为webList.Count在运行webisteList.Remove(网站)后降低了;但它不会删除字符串,它会循环遍历同一个字符串。

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;
    }
}
c# list loops foreach
1个回答
3
投票

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

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

for (int i = websiteList.Count - 1; i >= 0; i--) {
    if (<condition>) {
        proxyList.RemoveAt(i);
        websiteList.RemoveAt(i);
    }
}

如果您有一个网站类,这将简化操作属于一起的东西。它还具有以下优点:您可以添加属于网站和代理的其他逻辑(如提取端口号):

public class Website
{
    public string Site { get; set; }
    public string Proxy { get; set; }

    public int Port {
        get {
            string[] proxySplit = proxy.Split(':');
            int portNo = 0;
            if (proxySplit.Length == 2) {
                Int32.TryParse(proxySplit[1], out portNo);
            }
            return portNo;
        }
    }
}

现在列表的类型为List<Website>,包含网站和代理

您可以像以前一样使用for循环删除或使用LINQ并创建仅包含所需项目的新列表

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

注意:有一个System.Uri类用于操作统一资源标识符。除其他外,它可以提取端口号。考虑使用此类而不是您自己的类。

© www.soinside.com 2019 - 2024. All rights reserved.