2017-12-28 24 views
-4

WebListから実際の文字列を削除しない理由はわかりませんが、ProxyListから削除されるので奇妙です。なぜリストから文字列を削除しても何も削除されない

デバッグ時に、webisteList.Remove(Webサイト)を実行した後にwebsiteList.Countが低くなるため、何かが削除されると表示されます。 しかし、それは文字列を削除しません、同じ文字列をループし続けます。あなたが繰り返し同じproxyListから削除されている

foreach (var website in websiteList.ToArray()) 
{ 
    var webSplit = website.Split(')'); 

    foreach (var proxy in proxyList.ToArray()) 
    { 
     if (proxyList.Count > 0) 
     { 
      if(websiteList.Count > 0) 
      { 
       var proxySplit = proxy.Split(':'); 
       int Port; 
       bool convert = Int32.TryParse(proxySplit[1], out Port); 

       if (this returns true) 
       { 
        Console.WriteLine("Removing proxy"); 
        proxyList.Remove(proxy); 
        websiteList.Remove(website); 

       } 
       if (this returns true) 
       { 
        Console.WriteLine("Removing proxy"); 
        proxyList.Remove(proxy); 
        websiteList.Remove(website); 
       } 
      } 
     } 
     else 
      break; 
    } 
} 
+3

実際のコードを掲載してください。 'if(これが真を返す)'は有効ではないC#。あなたの問題が、 'websiteList'からアイテムを削除しても、あなたが反復処理している一時配列オブジェクトからそのアイテムを削除しない場合は、最初に' ToArray() 'をなぜ呼び出すのかについてもう一度考えてください。つまり、なぜToArray()を呼び出すのかを知っていると仮定します。 –

+0

ループ内のリストを変更することはできません。 – Paparazzi

+1

さらに、両方のifブロックで同じことをやっていることになります( 'this returns true'ビットは単にプロキシコードなど)。この方法でコードを繰り返すのは悪いです。両方のチェックを1つのif文に結合して||両方のチェックを実行します。 – MattD

答えて

3

(ウェブサイトがあるとして、すなわち、あなたは全体の内側のループに何度でも繰り返しています)。なぜこれらの2つのループがネストされていますか?ウェブサイトはプロキシに関連していないようです。プロキシリストがWebサイトから抽出される場合にのみ、ネストは意味をなさないでしょう。

これらの2つのリストは同じ長さで、プロキシは同じインデックスのWebサイトに属しているはずですか?このような場合は、for -loopを使用してループし、逆順にループしてインデックスが壊れないようにします。

for (int i = websiteList.Count - 1; i >= 0; i--) { 
    if (<condition>) { 
     proxyList.RemoveAt(i); 
     websiteList.RemoveAt(i); 
    } 
} 

ウェブサイトのクラスがあれば、一緒に属するものの操作が簡単になります。それはまた、あなたが(ポート番号を抽出するなど)のウェブサイトとプロキシに所属するロジックを追加することができるという利点があります。

public class Website 
{ 
    public string Site { get; set; } 
    public string Proxy { get; set; } 

    public int Port { 
     get { 
      string[] proxySplit = proxy.Split(':'); 
      int portNo = 0; 
      if (proxySplit.Length == 2) { 
       Int32.TryParse(proxySplit[1], out portNo); 
      } 
      return portNo; 
     } 
    } 
} 

今リストはタイプList<Website>であり、両方を含んで、ウェブサイトやプロキシ

あなたは注意を以前のようにforループを使用して削除するか、LINQを使用して

websiteList = websiteList.Where(w => <condition using w.Site, w.Proxy, w.Port>).ToList(); 

のみの目的のアイテムを含む新しいリストを作成することができ

:ユニフォームリソースidentifの操作のためSystem.Uriクラスがありますiers。とりわけ、ポート番号を抽出することができます。あなた自身の代わりにこのクラスを使うことを検討してください。

関連する問題