Проверьте на наличие дубликатов детей - PullRequest
3 голосов
/ 26 февраля 2011

Мое консольное приложение будет проходить через каждого пользователя, чтобы получить свои веб-сайты, чтобы оно могло делать новые скриншоты из них.Однако, чтобы предотвратить создание скриншота одного и того же веб-сайта дважды, я должен проверить, не был ли уже сделан снимок экрана с веб-сайтом других пользователей.

Мое текущее решение:

База данных:

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-адрес.какие-нибудь предложения по альтернативному пути?

1 Ответ

2 голосов
/ 26 февраля 2011

Вы можете использовать

 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);
}
...