C# 检查子副本

C# 检查子副本,c#,duplicates,console-application,C#,Duplicates,Console Application,我的控制台应用程序将循环通过每个用户获取他们的网站,这样它就可以拍摄他们的新屏幕截图。然而,为了防止同一个网站截图两次,我必须检查是否已经截图的网站,而通过其他用户的网站循环 我目前的解决办法是: 数据库: User |--> ID: 1 |--> FirstName: Joe |--> ID: 2 |--> FirstName: Stranger Websites |--> ID: 1 |--> UserID: 1 |--> URL: http:/

我的控制台应用程序将循环通过每个用户获取他们的网站,这样它就可以拍摄他们的新屏幕截图。然而,为了防止同一个网站截图两次,我必须检查是否已经截图的网站,而通过其他用户的网站循环

我目前的解决办法是:

数据库:

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);
            }
        }
    }
}
静态Web站点缩略图()
{
Console.WriteLine(“启动续订流程…”);
使用(_存储库)
{
var websitesUpdated=新列表();
foreach(存储库.GetAll()中的var user)
{
foreach(user.Websites.Where(website=>!websitesUpdated.Contains(website.URL))中的var网站)
{
_TakeScreenDumpAndSave(website.URL);
websitesUpdated.Add(website.URL);
Console.WriteLine(新字符串('-',50));
WriteLine(“{0}已成功续订”,website.URL);
}
}
}
}
然而,为这样的场景声明列表似乎是错误的,只是为了检查是否已经添加了特定的URL。。。有其他方法的建议吗?

您可以使用

 var websitesUpdated = new HashSet<string>();

@Jenea-你能解释一下
new Hash()
将如何成为O(1)而
new List()
将如何成为O(n)-以及它会有什么不同吗?@ebb-为了确定元素是否包含在列表中,你应该迭代整个列表。@Jenea-当我做
if(!websitesUpdated.Contains)时,不会
HashSet
做同样的事情(website.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);
}