2016-12-10 25 views
1

私のアプリケーションでは、scrape(string url)の方法を使用して、Webページからのリンクをスクラップします。私は毎回10のURLを返すと言います。foreach inside foreach inside foreach

私はすべての1つの傷ついたURLから10リンクを掻き集めたいと思います。

かいつまん:

(ステップ1)はWebページにアクセスし、ウェブページにステップ1、外出先からの10個のリンク

(ステップ2)foreachのリンクをこすり、10個のリンク

をこすり(ステップ3)ステップ2からの各リンクについて、ウェブページに行き、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ループを作らなければならないでしょう。

私に助言をいただけますか?

+0

である点を除くと、私は思います。 –

答えて

3

再帰関数が最適です。しかし、あなたはあなたが擦り傷にいるかの深さを追跡するためにパラメータを渡す必要があります。そうしないと、パブリックウェブ全体をクロールすることになります。

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); 
} 
+0

これはうまくいくでしょうが、この種の作業では並列処理が可能なものを書くことは意味があります。 – Thomas

+0

@トーマス - 確かに、これをもっと速く、より良くする方法がありますが、それは質問の意図ではありませんでした:)私たちは単にOPが「foreach」地獄から抜けるのを助けたいと思っています!実験的に、 'Parallel.Foreach()'は動作するかもしれませんが、そのような場合に基づいて、それはインクルードするのが理にかなっていません。 – Tommy

+0

'function'を削除しました。「無効な型を 'System.Collections.Generic.List 'に暗黙的に変換できません。 – Dawvawd

1

再帰を使用する必要があります。

ここでのアイデアは、子供がいなくなるまで同じ機能を引き続き呼び出すことです。再帰の例はtreelist機能でFindTreeNodeの内側にある:

TreeListNode FindTreeNode(TreeListNode node, Enumerations.ItemType type, Nullable<long> id) 
{ 
    foreach (var c in node.Nodes) 
    { 
     if ((Enumerations.ItemType)c[2] == type && 
      (id == null || (long)c[0] == id.Value)) { 

      return c; 
     } 

     if (c.HasChildren) 
     { 
      // Here is the secret sauce 
      // This is recursion 
      var exists = FindTreeNode(c, type, id); 
      if (exists != null) { return exists; } 
     } 
    } 
    return null; 
} 

同じ考え、上記のように、あなたのケースで、それはこれを行うためにあなたは再帰関数を必要とするウェブURI