2012-09-12 56 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);