2013-06-04 4 views
0

값을 얻으려고하는 여러 배열에 많은 데이터가 저장되어 있지만 문제가 있습니다. 식별자 배열 내 코드는 지금까지입니다 나는이 배열 그래서 여기배열에 저장된 정보 조작

String[] netOil2 = new String[600]; 
String[] netOil = new String[600]; 

의 데이터 정렬 정보를 그 배열에 일치하는 데이터를 찾을 얻을 수 있도록하려면

String[] seqNum2 = new String[600]; 
String[] seqNum = new String[600]; 

하지만 그것은 내가 원하는 정답을 출력하지 않습니다. 출력되는 것은 모두 "System.String [], NaN"이라고하는 무한 루프입니다.

private void netOilRadBtn_CheckedChanged(object sender, EventArgs e) 
    { 
     StreamWriter sw = new StreamWriter("test.txt"); //testing purposes only 
     //StreamReader sr = new StreamReader("OUTPUT.CSV"); 
     double first; 
     double second; 


     for (int i = 0; i < netOil2.Length; i++) 
      { 
       for (int j = 0; j < netOil.Length; j++) 
       { 
        if (seqNum2[i] == seqNum[j]) 
        { 
         //sw.WriteLine("Find New Seq Num"); 
         first = Convert.ToDouble(netOil2[i]); 
         second = Convert.ToDouble(netOil[j]); 

         double answer = (first - second)/first; 

         sw.WriteLine("{0}, {1}", seqNum2, answer); 
        } 
       } 
      } 

    } 

내가 할 수 있기를 원하는 것은 매칭을 임의로 다음을 두 번 대답 출력됩니다. 어떤 도움이라도 대단히 감사하겠습니다.

+0

"문자열 seqNum2 = 새로운 String [600];" 이 컴파일됩니까? – David

+0

@ David 나는 방금 옳게 보이도록 수정했습니다. – Stock

+0

배열'sw.WriteLine ("{0}, {1}", seqNum2 [i], 대답)에서 현재 항목을 써야한다고 생각합니다. –

답변

1
private void netOilRadBtn_CheckedChanged(object sender, EventArgs e) 
{ 
    using (var sw = new StreamWriter("test.txt")) //testing purposes only 
    { 
     //StreamReader sr = new StreamReader("OUTPUT.CSV"); 

     var items = netOil.Zip(seqNum, (oil, seq) => new {Oil = oil, Seq = seq}); 
     var items2 = netOil2.Zip(seqNum2, (oil, seq) => new {Oil = oil, Seq = seq}); 

     foreach (var item in items.Join(items2, 
        i=>i.Seq,i=>i.Seq, (a,b)=> 
        { 
         double first = Convert.ToDouble(a.Oil); 
         double second = Convert.ToDouble(b.Oil); 

         double answer = (first - second)/first; 
         return string.Format("{0}, {1}", a.Seq, answer); 
        })) 

     { 
      sw.WriteLine(item); 
     } 
    } 
} 
+0

@Joel 이렇게하면 if 문에 오류가 발생합니다. "implicity가 'string'을 'bool'로 변환 할 수 없습니다. – Stock

+0

이 방법이 효과가 있습니다. 감사합니다. – Stock

2

따라서이 라인 :

sw.WriteLine("{0}, {1}", seqNum2, answer); 

출력 System.String[], NaN.

seqNum2은 배열이므로 출력에 System.String[]이 나오는 이유입니다. 현재 처리중인 seqNum2의 요소를보고 싶다면 seqNum2[i]을 원했을 것입니다. 물론 배열 요소 (아래 참조)를 초기화하지 않으므로 값이 null이고 빈 문자열로 포맷되므로 예상대로 표시되지 않으므로 , Nan이 출력됩니다 .

당신이 출력 NaN 얻는 이유는 라인 :

double answer = (first - second)/first; 

내가 firstsecond은 첫째 0 인 경우 모두 0, 당신은 Infinity을 얻을 것이고, 그렇지 않으면 0

를 얻을 것이라고 생각 당신이 netOilnetOil2 배열에 문자열 값을 설정하지 않기 때문에

이 값은 0 대부분으로 설정됩니다, 그래서 당신은 600 개 null들과 Convert.ToDouble(null) 반환 0

코드를 디버그하고 Convert.ToDouble을 호출하는 값과 반환 값을 확인하십시오.

+0

seqNum2 [i]로 바 꾸었으나 이제는 아무 것도 출력하지 않습니다 – Stock

+0

무엇을 기대 하시겠습니까? –

+0

seqNum [i]의 요소는 무엇입니까? – Stock

0

Array.ToString()을 호출하기 때문에 "System.String []"이 나타납니다. NaN은 분명히 NaN입니다. 내 추측은 그 중 하나입니다 그 중 하나가

    first = Convert.ToDouble(netOil2[i]); 
        second = Convert.ToDouble(netOil[j]); 

반환 NaN입니다. 이 줄에 중단 점을 넣고 netOil2 [i] netOil [j]의 값이 실제로 숫자를 나타내는 지 확인합니다. Convert.ToDouble이 반환하는 값은 현재 문화권을 기반으로합니다.

0

대신 쌍의 배열, 나는 Dictionary 컬렉션을 사용합니다.

:

Dictionary<Int32, Double> dictOil1 = new Dictionary<Int32, Double(); 
Dictionary<Int32, Double> dictOil2 = new Dictionary<Int32, Double(); 

//If seqNum and netOil _really are_ strings... 
Int32 seq, seq2; 
Double oil, oil2; 
if (Int32.TryParse(seqNum, out seq) && Double.TryParse(netOil, out oil)) 
    dictOil1.Add(seq, oil); 
if (Int32.TryParse(seqNum2, out seq2) && Double.TryParse(netOil2, out oil2)) 
    dictOil2.Add(seq2, oil2); 
관련 문제