【问题标题】:Why isnt it deleting the string from the list but it does delete something为什么它不从列表中删除字符串,但它确实删除了一些东西
【发布时间】:2017-12-28 21:14:21
【问题描述】:

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

调试时它说它确实删除了一些东西,因为在运行 webisteList.Remove(website); 后 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;
    }
}

【问题讨论】:

  • 请发布您的实际代码。 if (this returns true) 不是有效的 C#。如果您的问题是从websiteList 中删除一个项目不会同时从您正在迭代的临时数组对象中删除它,请返回并重新考虑您首先调用ToArray() 的原因。也就是说,假设你完全知道为什么要打电话给ToArray()
  • 无法修改循环中的列表。
  • 此外,您在两个 if 块中都在做同样的事情(假设您的 'this 返回 true' 位只是代理代码或其他东西)。以这种方式重复代码是不好的。使用 || 将两个检查合并到一个 if 语句中运行这两项检查。
  • @EdPlunkett:ToArray() 是有道理的,因为您无法修改您正在枚举的集合。像这样枚举数组但从列表中删除。
  • @OlivierJacot-Descombes 我知道他为什么打电话给 ToArray。

标签: c# list loops foreach


【解决方案1】:

您从同一个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&lt;Website&gt;,包含网站和代理

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

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

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

【讨论】:

    猜你喜欢
    • 2020-07-17
    • 2023-03-27
    • 1970-01-01
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    • 2016-05-21
    • 2018-04-12
    相关资源
    最近更新 更多