вставка в массив в foreach - PullRequest
       3

вставка в массив в foreach

0 голосов
/ 28 сентября 2011

У меня есть следующий код. Я делаю какую-то работу на сайтах, но иногда они перенаправляют, и если они делают это, я хочу сделать работу на перенаправленном сайте. НО я не хочу проверять все сайты на перенаправление перед выполнением работы, так как их мало. Так как я могу вставить его в цикл? Я знаю, что не могу вставить в массив строк, но какая структура лучше? Вероятно, список из-за вставки, хотя я не очень стремлюсь к значениям, которые мы уже обработали. Я не опытный в C #.

string[] lines = System.IO.File.ReadAllLines(@"my_file_with_urls.txt");

foreach (string line in lines)
{
  Uri default_uri = new Uri(line);
  Uri response;

  WebSiteIsAvailable(default_uri, out response); 

  //Do work on the actual link

  if (!response.Host.Equals(default_uri.Host)){
    //I want to run the work on the redirected website
  }
}

Ответы [ 3 ]

1 голос
/ 28 сентября 2011
var urisToProcess = new HashSet<Uri>(
  lines.Where(s => Uri.IsWellFormedUriString(s, UriKind.Absolute)).Select(s => new Uri(s)));
var redirectedUris = new HashSet<Uri>();
foreach (var uri in urisToProcess)
{
  Uri response;    
  WebSiteIsAvailable(uri, out response); 
  if(response.Equals(uri))
  {
    // do work on actual URI
    continue;
  }
  while (!response.Equals(uri))
  {    
    uri = response;
    WebSiteIsAvailable(uri, out response); 
  }
  if(!urisToProcess.Contains(uri))
  {
     redirectedUris.Add(uri);
  }
}
foreach (var uri in redirectedUris)
{
  // do work on redirected URI
}
0 голосов
/ 28 сентября 2011

Вы не можете вставлять элементы в массив или список, через который вы просматриваете foreach. Вместо этого создайте цикл for и уменьшите индекс цикла.

0 голосов
/ 28 сентября 2011

Вы можете попробовать, я не полностью проверил это, но.

foreach (string line in lines) 
{   
 Uri default_uri = new Uri(line);   
 Uri response;    
 WebSiteIsAvailable(default_uri, out response);     

 while (!response.Host.Equals(default_uri.Host))
 {    
  default_uri = response;
  WebSiteIsAvailable(default_uri, out response); 
 } 

 //Do work on the actual link as now default_uri contains the working link.
} 
...