2014-09-26 4 views
0

UI에서 요소를 읽고이를 배열에 저장하는 코드가 있습니다. 그리고 모든 배열 요소에 대해 배열 상에 문자열이 있는지 검사하려고합니다. 배열에 대해 반복하는 다른 foreach를 사용하고 있습니다. 이 foreach는 여분의 빈 문자열 출력을 returing합니다.foreach의 배열 이득 값 #

public void fn_AddContact_CodedStep1() 
    { 
     string[] ContactContent = new string[30]; 
     int i = 0, j = 0; 
     int numberOfContacts=0; 
     bool isthere; 

List<Element> Contacts = Pages.CareMechanix.Find.AllByAttributes("class=pull-left contact-description").ToList(); 
     foreach (Element e in Contacts) 
     { 
      ContactContent[i] = Convert.ToString(e.InnerText); 
      file2.WriteLine("Contact Content="+ContactContent[i]); 
      i++; 
     } 
      numberOfContacts = ContactContent.Length; 

     if (numberOfContacts>0) 
     { 
      try 
      { 
       foreach (string p in ContactContent) 
       { 
        file2.WriteLine("string=" + p); 
        isthere = p.Contains("Dorek"); 
        if (isthere == true) 
        { 
         file2.WriteLine("person found"); 
         break; 
        } 
       } 

      } 

      catch(Exception e) 
      { 
       file2.Close(); 

      } 
     } 

     file2.Close(); 
     } 

file2의 출력 내용은 다음과 같습니다. I은 5 요소는 상기 제의 foreach (즉 어레이)에 반환되고있는 동안

Contact Content=Evangeline KaliskiblackCircle 
Contact Content=Derek TakamineblackCircle 
Contact Content=Monica ThaneerblackCircle 
Contact Content=qaorg1prov1First aQAorg1prov1LastPCPblackCircle 
Contact Content=QAOrg1Mbr1First eQAOrg1Mbr1LastMemberblackCircle 
string=Evangeline KaliskiblackCircle 
string=Derek TakamineblackCircle 
string=Monica ThaneerblackCircle 
string=qaorg1prov1First aQAorg1prov1LastPCPblackCircle 
string=QAOrg1Mbr1First eQAOrg1Mbr1LastMemberblackCircle 
string= 

왜 빈 문자열은 제 foreach 루프로 리턴된다 ??

+1

ContactContent에 몇 개의 요소가 있습니까? –

+2

우리는'ContactContent' 배열을 초기화하는 코드를보아야합니다. 다른 메모에서는'List '을 대신 사용해보십시오. – juharr

+0

나는 5 개의 요소가 있다는 것을 보여주는 file1에 연락 내용의 요소를 쓰고있다. (위 참조) –

답변

2

문제는 배열하면 배열이 초기화되어 있기 때문에 (nullp를 설정합니다 6 반복에 점을 제외하고 30 회 반복 것

foreach(string p in ContactContent) 

않도록 때 30으로 설정 한 것입니다 null 값) 예외는 캐치하고 파일을 닫습니다하지만, 그 라인 전에이 작업을 수행

isthere = p.Contains("Dorek"); 

에게 던져 줄을 발생합니다. 기록합니다

file2.WriteLine("string=" + p); 

는 "문자열 ="때문에 문자열을 + 연산자는 null을 무시합니다.

내 수정 제안은 배열 대신 List<string>을 사용하고 단순히 값을 추가하는 것입니다.

List<string> ContactContent = new List<string>(); 
... 
ContactContent.Add(e.InnerText); 

는 또한 파일의 폐쇄 정말에 있어야 최종적으로 차단하거나 당신이 끝나면 그것을 닫는 처리 할 수 ​​있도록 가능한 것은 사용하여 블록이 메소드 내부 file2를 초기화 코드를 이동 넣어, 예외가 발생할 경우

using(var file2 = InitializeFile2Here()) 
{ 
    // use file2 here 
} // file2 will be disposed/closed here. 
+0

내가 본다. 그래서 나는이 모든 동안 여분의 문자열을 얻고있다! 나는 그것을 이해했다. Juharr에게 감사한다. 그것은 지금 일한다. –

1

실제로 배열에는 30 개의 요소가 있습니다. 두 번째 foreach 루프 foreach (string p in ContactContent)은 30 개의 요소를 모두 열거합니다. 하지만 여섯 번째 요소의 경우 여기 NPE를 얻습니다 : p.Contains("Dorek"); (p가 null이기 때문에) 결국 블록으로갑니다. 그러나 여섯 번째 요소에 대한 레코드가 파일에 추가됩니다. 그래서 파일에 추가 문자열이 있습니다.

1

당신은 당신이 그것을 선언하고 배열로 초기화하는

 string[] ContactContent = new string[30]; 

ContactContent

선언합니다. 따라서 30 개의 요소 (처음에는 모두 null 임)가 있으며 항상 30 개의 요소가 있습니다. 그걸 반복 할 때, 널을 가지고 있든 또는 그 요소에 문자열을 넣었 든, 30 개를 반복 할 것입니다. 이것을 어떻게 사용하고 있는지 보려면 List<string>을 사용하는 것이 좋습니다. 그렇지 않으면 일반 for 루프를 사용해야하고 'i'의 값을 종결 조건의 일부로 사용해야합니다.

첫 번째 null에 도달하면 null 예외 오류가 발생하여 캐치되므로 모든 30을 반복하기 전에 단락됩니다.