我有这段代码:
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我调用测试函数,然后webSites每次都有一个不同的链接列表,以删除所有不以http://www.ynet.co.il开头的链接
所以最后每次我都会在网站上出现只有以下内容的链接:http://www.ynet.co.il
但似乎我的removeExternals函数不能正常工作。
问题在哪里以及如何修复?感谢。
答案 0 :(得分: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);
}
}
答案 1 :(得分:2)
同意Mike Christensen关于您的问题的原因。这就是我建议的而不是循环:
externals.RemoveAll(s => s.StartsWith(mainUrl));
您可以使用此行替换removeExternals
方法。
答案 2 :(得分:0)
我注意到的第一件事是你的removeExternals方法是从零元素中删除项目,这可能导致错误删除,因为编号元素随索引删除而变化。要解决这个问题,请将循环从最后转到开头,这样可以保证删除顺序正确。