编辑: 我想尝试递归: 在Form1的顶部我有:
List<string> webSites = new List<string>();
List<string> csFiles = new List<string>();
在构造函数中我有:
webCrawler(url, 2);
然后我有getLinks函数:
private void getLinks()
{
foreach (HtmlNode link in doc.DocumentNode.SelectNodes("//a[@href]"))
{
var href = link.Attributes["href"].Value;
richTextBox1.Text += href + Environment.NewLine;
webSites.Add(href);
}
}
private List<string> test(string url, int levels)
{
doc = hw.Load(url);
getLinks();
if (levels == 0)
{
return csFiles;
}
else
{
for (i = 0; i < webSites.Count(); i++)
{
string t = webSites[i];
var f = levels * test(url, levels - 1);
}
}
return csFiles;
}
webSites和csFiles都是List,级别是int。
问题在于:var f = levels * test(url, levels - 1);
在右侧我得到错误:错误运算符'*'不能应用于'int'和'System.Collections.Generic.List
我该如何解决?
在功能测试中我也调用函数getLinks() 我还需要为每个站点仅从.cs文件中取出的cs文件创建一个函数,最后在测试函数中我需要返回csFiles列表。
答案 0 :(得分:0)
在行中:“var f = levels * test(url,levels - 1);”
f设置为等于“level”int的结果,以及方法“test(url,levels -1)”的结果。
方法“test(url,levels - 1)”的结果是类型字符串列表。
这意味着您正在尝试将整数与List相乘。
你可以简单地使用.Count或.Length ......
该行应为:“var f = levels * test(url,levels - 1).Count();”
答案 1 :(得分:0)
感觉就像100级cs课程的作业,但是暂时假设它不是,我将把它作为一种方法:
public static List<string> CrawlWithDepth(string url, int depth)
{
var ret = new List<string>();
var linksFromPage = GetLinks(url);
ret.AddRange(linksFromPage);
if (depth > 0)
{
foreach (var childLink in linksFromPage)
{
var childCrawlResults = CrawlWithDepth(childLink, depth - 1);
ret.AddRange(childCrawlResults);
}
}
}
private static List<string> GetLinks(string url)
{
var ret = new List<string>();
foreach (HtmlNode link in doc.DocumentNode.SelectNodes("//a[@href]"))
{
var href = link.Attributes["href"].Value;
ret.Add(href);
}
return ret;
}