2011-02-26 2 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 (1) вместо O (N) в списке случае.

EDIT: Кстати, я бы взял все URL-адреса от каждого пользователя и поместил их в один 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 (п) - и какой он отличается? – ebb

+0

@ebb - Чтобы найти элемент, содержащийся в списке, необходимо перебрать весь список. –

+0

@Jenea - Не было бы 'HashSet' делать то же самое, когда я делаю' if (! WebsitesUpdated.Contains (website.URL)) {..} '? – ebb

Смежные вопросы