2011-02-26 18 views
3

私のコンソールアプリケーションは、自分のウェブサイトを取得するために各ユーザーをループします。そのため、新しいコンソールのスクリーンショットを撮ることができます。しかし、同じWebサイトのスクリーンショットを2回撮るのを防ぐために、別のユーザーのWebサイトをループしながら、すでにWebサイトのスクリーンショットを撮っているかどうかをチェックする必要があります。子の重複を確認する

私の現在のソリューションは、次のとおりです。

データベース:

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

あなたは、リストの場合には代わりにOの操作Oの

var websitesUpdated = new HashSet<string>(); 

コスト(1)(n)を使用することができます。

編集: ところで、私は各ユーザーからすべてのURLを受け取り、それらをすべて1つの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 - あなたは '新しいハッシュは()' Oだろう方法を説明してもらえ(1) 'N(Oだろう'新しいリスト()しながら、 ) - それはどのように違うのですか? – ebb

+0

@ebb - 要素がリストに含まれているかどうかを調べるには、リスト全体を反復処理する必要があります。 –

+0

@Jenea - Wouldnt 'HashSet'は、' if(!websitesUpdated.Contains(website.URL)){..} 'と同じことをしますか? – ebb

関連する問題