2

我有这个代码:

private void ToLocalSiteOnlyToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (buttonSwitch == true)
            {
                ToLocalSiteOnlyToolStripMenuItem.ForeColor = Color.Red;
                buttonSwitch = false;
                removeExt = true;
            }
            else
            {
                ToLocalSiteOnlyToolStripMenuItem.ForeColor = Color.Black;
                buttonSwitch = true;
                removeExt = false;
            }
        }



private void removeExternals(List<string> externals)
    {

        for (int i = 0; i < externals.Count; i++)
        {
            if (!externals[i].StartsWith(mainUrl))
            {
                externals.RemoveAt(i);
            }
        }
    }

当我点击菜单和它的红色然后我在这里调用函数 removeExternals :

private List<string> test(string url, int levels,DoWorkEventArgs eve)
        {

            HtmlWeb hw = new HtmlWeb();
            List<string> webSites;
            try
            {
                doc = hw.Load(url);
                webSites = getLinks(doc);
                removeDupes(webSites);
                if (removeExt == true)
                {
                    removeExternals(webSites);
                }

现在网站列表包含网站的链接,例如:

www.ynet.co.il
www.hot.co.il
www.walla.co.il

现在变量 mainUrl 是http://www.ynet.co.il 我希望每个 iertion 即时调用测试函数,然后网站每次都有不同的链接列表以删除所有不以http://www开头的链接.ynet.co.il

所以最后每次我都会在网站上出现仅以以下链接开头的链接:http ://www.ynet.co.il

但似乎我的 removeExternals 函数并没有像我想要的那样运行良好。

问题出在哪里以及如何修复?谢谢。

4

3 回答 3

2

问题出在你的循环中:

  for (int i = 0; i < externals.Count; i++)
  {
      if (!externals[i].StartsWith(mainUrl))
      {
          externals.RemoveAt(i);
      }
  }

每次调用RemoveAt()时,都会更改所有索引。如果您调用RemoveAt(1),则 1 之后的所有内容都会向下移动。我建议以相反的顺序循环,例如:

  for (int i = externals.Count - 1; i >= 0; i--)
  {
      if (!externals[i].StartsWith(mainUrl))
      {
          externals.RemoveAt(i);
      }
  }
于 2012-09-17T03:08:28.307 回答
2

同意迈克克里斯滕森关于您的问题的原因。这是我推荐的,而不是循环:

externals.RemoveAll(s => s.StartsWith(mainUrl));

你可以用这条线替换你的removeExternals方法。

于 2012-09-17T03:12:32.107 回答
0

我注意到的第一件事是您的 removeExternals 方法正在从零元素中删除项目,这可能导致不正确的删除,因为编号的元素会随着索引删除而变化。要解决该问题,请反转循环以从结尾到开头,这将保证删除以正确的顺序完成。

于 2012-09-17T03:10:04.603 回答