2017-12-28 3 views
-4

그래서 WebsiteList에서 실제 문자열을 삭제하지 않는 이유는 모르겠지만 ProxyList에서 삭제하기 때문에 이상합니다.목록에서 문자열을 지우지 않는 이유는 무엇입니까?

디버깅 할 때 webisteList.Remove (웹 사이트)를 실행 한 후 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 (this returns this) '가 유효하지 않습니다. C#. 'websiteList'에서 항목을 삭제해도 임시 배열 객체에서 삭제되지 않는다면, 처음으로 ToArray()를 호출하는 이유에 대해 다시 생각해보십시오. . 즉, ToArray()를 호출하는 이유를 알고 있다고 가정합니다. –

+0

루프에서 목록을 수정할 수 없습니다. – Paparazzi

+1

또한 if 블록 모두에서 똑같은 작업을 수행합니다 ('this returns true'가 프록시 코드 일 뿐이라는 가정하에). 이런 방식으로 코드를 반복하는 것은 좋지 않습니다. 두 검사를 하나의 if 문으로 결합하여 || 두 검사를 모두 실행합니다. – MattD

답변

3

(웹 사이트가 있기 때문에 즉 당신은 전체 내부 루프를 여러 번 반복된다). 그 2 개의 루프가 왜 중첩되어 있습니까? 웹 사이트는 프록시와 관련이없는 것으로 보입니다. 프록시 목록이 웹 사이트에서 추출되는 경우에만 중첩이 의미가 있습니다.

이 2 개의 목록은 동일한 길이로되어 있고 동일한 색인의 웹 사이트에 속한 프록시를 갖고 있습니까? 이 경우 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>입니다 및 웹 사이트와 프록시를 모두 포함

당신은 이전과 루프의를 사용하여 삭제하거나 LINQ를 사용만을 원하는 항목

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

주를 포함하는 새로운 목록을 만들 수 있습니다 : 균일 한 자원 IDENTIF의 조작을위한 System.Uri 클래스가있다 iers. 무엇보다도 포트 번호를 추출 할 수 있습니다. 자신의 클래스 대신이 클래스를 사용하는 것을 고려하십시오.

관련 문제