-1

編集: 再帰的にしようとしています: 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 で、levels は int です。問題は、次の行にありvar f = levels * test(url, levels - 1); ます: 右側にエラーが表示されます: エラー演算子 '*' は、タイプ 'int' および 'System.Collections.Generic.List のオペランドに適用できません。

どうすれば修正できますか?


関数テストでは、関数 getLinks() も呼び出します。各サイトから .cs ファイルのみを取り出す cs ファイル用の関数も作成する必要があり、最後にテスト関数で csFiles リストを返す必要があります。

4

2 に答える 2

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;
}
于 2012-05-14T03:12:25.937 に答える
0

行: "var f = levels * test(url, levels - 1); "

f は、"levels" int の結果、およびメソッド "test(url, levels -1)" の結果に等しく設定されます。

メソッド "test(url, levels - 1)" の結果は、文字列型のリストです。

これは、整数とリストを乗算しようとしていることを意味します。

単純に .Count または .Length... を使用できます。

行は次のようになります: "var f = levels * test(url, levels - 1).Count(); "

于 2012-05-13T18:29:55.297 に答える