2012-09-12 93 views
0

我有這樣的代碼:如何通過兩個列表循環來比較兩個列表中的項目?

private void removeDuplicates(List<string> currentSites, List<string> visitedSites) 
     { 
      for (int i = 0; i < currentSites.Count; i++) 
      { 
       for (int x = 0; x < visitedSites.Count; x++) 
       { 

       } 
      }      
     } 

即時得到兩個列表,我需要先對每個項目在一個列表上的所有項目中的其他名單與其他列表中的項目循環和比較。如果其他列表中存在其中一個項目,則將其標記爲NULL。

我需要檢查visitedSites是否位於currentSites中,以便將一個項目移動到所有列表上以檢查是否退出,如果它標記爲null。

在任何情況下,我需要使用兩個循環的一個在另一個。

當我找到它的空標記它爲null並在它休息之後;

然後我需要添加另一個循環FOR來移動List currentSites,如果我沒有錯,並刪除所有標記的NULL項。

這個想法是通過將重複項標記爲null然後刪除所有null來比較列表。

這是從一開始的代碼:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using HtmlAgilityPack; 
using System.IO; 
using System.Text.RegularExpressions; 
using System.Xml.Linq; 
using System.Net; 
using System.Web; 


namespace GatherLinks 
{ 
    public partial class Form1 : Form 
    { 
     List<string> currentCrawlingSite; 
     List<string> sitesToCrawl; 
     int actual_sites; 
     BackgroundWorker worker; 
     int sites = 0; 
     int y = 0; 
     string guys = "http://www.google.com"; 

     public Form1() 
     { 
      InitializeComponent(); 

      currentCrawlingSite = new List<string>(); 
      sitesToCrawl = new List<string>(); 
      actual_sites = 0; 
        } 

     private void Form1_Load(object sender, EventArgs e) 
     { 

     } 


     private List<string> getLinks(HtmlAgilityPack.HtmlDocument document) 
     { 

      List<string> mainLinks = new List<string>(); 
      var linkNodes = document.DocumentNode.SelectNodes("//a[@href]"); 
      if (linkNodes != null) 
      { 
       foreach (HtmlNode link in linkNodes) 
       { 
        var href = link.Attributes["href"].Value; 
        mainLinks.Add(href); 
       } 
      } 
      return mainLinks; 

     } 


     private List<string> webCrawler(string url, int levels , DoWorkEventArgs eve) 
     { 
       HtmlAgilityPack.HtmlDocument doc; 
       HtmlWeb hw = new HtmlWeb(); 
       List<string> webSites;// = new List<string>(); 
       List<string> csFiles = new List<string>(); 

       csFiles.Add("temp string to know that something is happening in level = " + levels.ToString()); 
       csFiles.Add("current site name in this level is : " + url); 
           try 
       { 
        doc = hw.Load(url); 
        currentCrawlingSite.Add(url); 
        webSites = getLinks(doc); 
        removeDuplicates(currentCrawlingSite, webSites); 
        removeDuplicates(currentCrawlingSite, sitesToCrawl); 
        sitesToCrawl = webSites; 



        if (levels == 0) 
        { 
         return csFiles; 
        } 
        else 
        { 


         for (int i = 0; i < webSites.Count() && i < 20; i++)       { 
          int mx = Math.Min(webSites.Count(), 20); 

          if ((worker.CancellationPending == true)) 
          { 
           eve.Cancel = true; 
           break; 
          } 
          else 
          { 

           string t = webSites[i]; 
                   if ((t.StartsWith("http://") == true) || (t.StartsWith("https://") == true)) 
           { 

             actual_sites++; 
             csFiles.AddRange(webCrawler(t, levels - 1,eve)); 
             this.Invoke(new MethodInvoker(delegate { Texts(richTextBox1, "Level Number " + levels + " " + t + Environment.NewLine, Color.Red); })); 
             worker.ReportProgress(Math.Min((int)((double)i/mx * 100),100)); 



           } 
          } 
         } 

         return csFiles; 
        } 



       } 
       catch 
       { 
        return csFiles; 
       } 

     } 

所以即時調用removeDuplicated函數兩次需要在removeDuplicated做我上面然後寫的東西林不知道如果要做sitesToCrawl =網站;或者以某種方式將webSites中的鏈接添加到sitesToCrawl。這個想法是當我循環瀏覽webSites時,添加到csFiles列表中時不會有重複的項目。

+0

那麼什麼是你的問題?你的代碼可以寫得更有效率和更短,但是你在這裏沒有以某種方式工作嗎?如果它不起作用,那麼它不起作用呢? – Servy

回答

2

不知道如果我理解你的問題:

IEnumerable<string> notVisitedSites = currentSites.Except(visitedSites);