2017-02-11 2 views
0

Я работаю над проектом по разработке изображений, и вместо Hashset вместо массива я использовал Hashset, чтобы не добавлять повторяющиеся URL-адреса при сборке URL-адресов, я достиг точки кода, чтобы перебрать Hashset, содержащий основные URL-адреса и внутри итерации я иду и загружаю страницу основного URL-адреса и добавляю их в Хашет, и продолжаю, и во время итерации я должен исключать каждый отсканированный URL-адрес, а также исключать (удалять) каждый URL-адрес, который заканчивается jpg, до тех пор, пока счет Хасета url не достигнет 0, вопрос в том, что я столкнулся с бесконечным циклом на этой итерации, где я могу получить url (давайте назовем его X)Обработка Hashset, чтобы избежать застревания в цикле во время итерации

1- Я просматриваю страницу URL-адреса X 2 - получить все URL страницы X (путем применения фильтров) 3- Добавить URLs к HashSet с использованием unioinwith 4- удалить отсканированное URL-адрес X

проблема возникает здесь, когда один из URL-адресов Y, при сканировании принести X снова

мне использовать словарь и ключ, как «сканируется "?? Я попытаюсь опубликовать результат здесь, извините, что мне приходит в голову после того, как я разместил вопрос ...

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

while (URL_Can.Count != 0) 
{ 

        tempURL = URL_Can.First(); 

        if (tempURL.EndsWith("jpg")) 
        { 
         URL_CanToSave.Add(tempURL); 
         URL_Can.Remove(tempURL); 

        } 
        else 
        { 

         if (ExtractUrlsfromLink(client, tempURL, filterlink1).Contains(toAvoidLoopinLinks)) 
         { 

          URL_Can.Remove(tempURL); 

          URL_Can.Remove(toAvoidLoopinLinks); 
         } 
         else 
         { 
          URL_Can.UnionWith(ExtractUrlsfromLink(client, tempURL, filterlink1)); 

          URL_Can.UnionWith(ExtractUrlsfromLink(client, tempURL, filterlink2)); 

          URL_Can.Remove(tempURL); 

          richTextBox2.PerformSafely(() => richTextBox2.AppendText(tempURL + "\n")); 
         } 

        } 

        toAvoidLoopinLinks = tempURL; 

       } 

ответ

0

Спасибо за все, мне удалось решить эту проблему с помощью словаря вместо HashSet и используйте ключ, чтобы держать URL, а значение держать Int, чтобы быть 1, если URLs сканируется, или 0, если URL еще не обработан, ниже мой код. Я использовал другой словарь «URL_CANtoSave для хранения URL-адреса, который заканчивается jpg« моя цель »... и этот цикл While..can зацикливается до тех пор, пока весь URL-адрес веб-сайта не закончится на основе значений, указанных в строке фильтра переменная, которую разобрать URLs соответственно.

так, чтобы разорвать петлю можно указать количество изображений URL, чтобы получить в URL_CantoSave.

return Task.Factory.StartNew(() => 
     { 
      try 
      { 


       string tempURL; 

       int i = 0; 

// Я использовал, чтобы установить значение ключа Dictionary, 1 или 0 (1 означает, что отсканировано, 0 означает, что еще нет и повторить до тех пор, пока все словарные слова не будут отсканированы или вы не разобьетесь в середине в зависимости от того, сколько URL-адресов изображений вы собрали в другом словаре

   while (URL_Can.Values.Where(value => value.Equals(0)).Any()) 


       { 

// взять 1 ключ и положил его в переменном темпе

    tempURL = URL_Can.ElementAt(i).Key; 

// проверить, если он заканчивается с расширением целевого файла. в этом случае изображение файла

    if (tempURL.EndsWith("jpg")) 
        { 
         URL_CanToSave.Add(tempURL,0); 

         URL_Can.Remove(tempURL); 

        } 

// если не изображение пойти и загрузить страницу на основе URL и держать анализа

    else 
        { 

// если URL не сканируются до этого

     if (URL_Can[tempURL] != 1) 
         { 

// здесь кажется сложным немного, где Add2Dic - это процесс добавления в словари без повторного добавления ключа (решение основной проблемы!) «ExtractURLfromLink» это еще один процесс, который вернуть словарь со всеми ссылками проанализированных скачав документ строку URL-адрес и анализируя его, вы можете добавить строку удалить фильтр на основе анализа вы

Add2Dic(ExtractUrlsfromLink(client, tempURL, filterlink1), URL_Can, false); 
Add2Dic(ExtractUrlsfromLink(client, tempURL, filterlink2), URL_Can, false); 

URL_Can[tempURL] = 1; // to set it as scanned link 


    richTextBox2.PerformSafely(() => richTextBox2.AppendText(tempURL + "\n")); 
         } 



        } 


     statusStrip1.PerformSafely(() => toolStripProgressBar1.PerformStep()); 

// здесь идет другой трюк для продолжения этой итерации продолжается до тех пор, пока она не проверит все собранные ссылки

    i++; if (i >= URL_Can.Count) { i = 0; } 

        if (URL_CanToSave.Count >= 150) { break; } 

       } 


       richTextBox2.PerformSafely(() => richTextBox2.Clear()); 

       textBox1.PerformSafely(() => textBox1.Text = URL_Can.Count.ToString()); 


       return ProcessCompleted = true; 




      } 
      catch (Exception aih) 
      { 

       MessageBox.Show(aih.Message); 

       return ProcessCompleted = false; 

       throw; 
      } 


      { 
       richTextBox2.PerformSafely(()=>richTextBox2.AppendText(url+"\n")); 
      } 
     }) 
Смежные вопросы