2016-12-10 16 views
1

내 응용 프로그램에서 나는 scrape(string url) 방법을 사용하여 웹 페이지에서 링크를 다 쳤습니다. 수시로 10 URL을 돌려 주겠다고 말합니다.foreach 내부 foreach 내부 foreach

나는 각 하나의 스크랩 한 URL에서 10 개의 링크를 긁어 내고 싶습니다.

길고도 짧은 이야기 :

(1 단계) 웹 페이지로 이동하여 웹 페이지 (10 개) 링크

에게 1 단계에서 이동

(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'을 삭제했으며 "void '를'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