Foreach内的foreach在foreach

时间:2016-12-10 20:20:11

标签: c#

在我的应用程序中,我使用scrape(string url)方法从网页上抓取链接。让我们说它每次都会给我回复10个网址。

我想从每个抓取的网址中抓取10个链接。

长话短说:

(步骤1)转到网页并抓取10个链接

(步骤2)从步骤1开始的foreach链接进入网页并抓取10个链接

对于步骤2中的每个链接,

(步骤3)转到网页并抓取10个链接。

所以它会给我10 + 100 + 1000个链接= 1110。

当然我可以这样做:

    List<string> links1 = new List<string>();
    List<string> links2 = new List<string>();
    List<string> links3 = new List<string>();


    links1 = scrape("example.com"); //get 10 links

    foreach (string link in links1)
    {
        List<string> temp = new List<string>();
        temp = scrape(link);
        links2.AddRange(temp);
    } //get 100 links

    foreach (string link in links2)
    {
        List<string> temp = new List<string>();
        temp = scrape(link);
        links3.AddRange(temp);
    } // get 1000 links

但编辑很糟糕。如果我想刮掉链接10次怎么办?我必须制作10个foreach循环。

你能给我任何建议吗?

2 个答案:

答案 0 :(得分:3)

递归功能将是您最好的选择。但是,您需要传递一个参数来跟踪&#34;有多深&#34;你是在刮你或者你可能最终爬上整​​个公共网站。

public List<string> GetLinks(List<string> urls, int depth){
    var newUrls = new List<string>();
    if(depth == 0) return newUrls ;
    foreach(var url in urls){
         newUrls.AddRange(scrape(url));
    }
    return urls.AddRange(GetLinks(newUrls, depth - 1);
}

答案 1 :(得分:1)

您需要使用递归。

这里的想法是继续调用相同的函数,直到没有孩子离开。递归的一个例子是在treelist函数中的FindTreeNode中:

Public Function quartre(d As Date) As Integer
    Dim m As Integer
    m = Month(d)
    quartre = ((m - 1) Mod 3) + 1
End Function

与上面相同的想法,除了你的情况,它与web uri