2011-02-26 66 views
3

我的控制檯應用程序將循環瀏覽每個用戶以獲取他們的網站,以便它可以獲取他們的新屏幕截圖。但是,爲了防止兩次截取同一網站的截圖,我必須檢查是否已經截取了該網站的截圖,同時通過另一個用戶網站進行了循環。檢查孩子是否重複

我目前的解決辦法是:

數據庫:

User 
|--> ID: 1 
|--> FirstName: Joe 

|--> ID: 2 
|--> FirstName: Stranger 

Websites 
|--> ID: 1 
|--> UserID: 1 
|--> URL: http://site.com 

|--> ID: 2 
|--> UserID: 2 
|--> URL: http://site.com 

控制檯應用程序:

static void RenewWebsiteThumbNails() 
{ 
    Console.WriteLine("Starting renewal process..."); 

    using (_repository) 
    { 
     var websitesUpdated = new List<string>(); 

     foreach (var user in _repository.GetAll()) 
     { 
      foreach (var website in user.Websites.Where(website => !websitesUpdated.Contains(website.URL))) 
      { 
       _repository.TakeScreenDumpAndSave(website.URL); 
       websitesUpdated.Add(website.URL); 

       Console.WriteLine(new string('-', 50)); 
       Console.WriteLine("{0} has successfully been renewed", website.URL); 
      } 
     } 
    } 
} 

但是,它似乎是錯誤的申報清單這樣的情景,只是爲了檢查是否一個特定的URL已經被添加了......對於另一種方式的任何建議?

回答

2

您可以使用

var websitesUpdated = new HashSet<string>(); 

成本清單的情況下操作的O而不是O(1)(n)的。

編輯: 順便說一下,我會採取從每個用戶的所有網址,並把它們全部放在一個HashSet,所以不會有任何重複,然後只是迭代HashSet,因爲它是一個簡單的列表。

有些人會這樣想。

var websites = new HashSet<string>(); 
foreach (var url in _repository.GetAll().SelectMany(user=>user.Websites)) 
    websites.Add(url); 

在此之後,

foreach (var website in websites) 
{ 
Console.WriteLine(new string('-', 50)); 
Console.WriteLine("{0} has successfully been renewed",website.URL); 
} 
+0

@Jenea - 能否請你解釋一下'新的Hash ()'是O(1),而'新目錄()'會爲O(n ) - 它有哪些不同? – ebb 2011-02-26 15:41:35

+0

@ebb - 爲了查找元素是否包含在列表中,應該迭代整個列表。 – 2011-02-26 15:44:50

+0

@Jenea - Wouldnt'HashSet'做同樣的事,當我做'if(!websitesUpdated.Contains(website.URL)){..}'? – ebb 2011-02-26 15:51:15