2017-03-04 2 views
0

안녕하세요. 최소, 최대 및 평균 속도를 찾는 데 도움이 필요합니다. 필자는 데이터 그리드 뷰를 사용하고 속도를 포함한 차이 열을 생성했습니다. 사용자가 숫자가있는 파일을로드하면 속도가 두 배로 변환됩니다. 전에 : 299 후에 : 29.9. 내가 뭘하려는 건지 다른 속도의 평균을 찾아 최대입니다. 여기에 평균 및 최대 작업을 시도하는 코드 스 니펫이 있지만 작동하지 않으며 오류가 계속 발생합니다.테이블의 최소 최대 및 평균 데이터 찾기

MinSpeed = dataGridView1.Rows.Cast<DataGridViewRow>() 
        .Min(r => Convert.ToInt32(r.Cells[2].Value)); 
       label10.Text = "Minimum Speed: " + MinSpeed; 

       MaxSpeed = dataGridView1.Rows.Cast<DataGridViewRow>() 
        .Max(r => Convert.ToInt32(r.Cells[2].Value)); 
       label17.Text = "Maximum speed: " + MaxSpeed; 

       AvgSpeed = 0; 
       for (int i = 0; i < dataGridView1.Rows.Count; ++i) 
       { 
        AvgSpeed += Convert.ToInt32(dataGridView1.Rows[i].Cells[2].Value); 
       } 

제 코드에 사과드립니다. 최상의 형식이 아닙니다. 어떤 도움을 받으실 수 있습니다

+0

_ 키프가 오류를 발생시킵니다 ._ 오류 메시지를 공유하는 것은 어떻습니까? – Steve

+0

Soryy 예 오류는 다음과 같습니다. mscorlib.dll에서 'System.FormatException'형식의 처리되지 않은 예외가 발생했습니다. 추가 정보 : 입력 문자열의 형식이 올바르지 않습니다. – 786

+0

추가 정보 : MinSpeed, MaxSpeed ​​및 AvgSpeed를 모두 int로 선언했습니다. – 786

답변

1

열에는 29.9과 같은 부동 소수점 값이 들어있는 경우 Integer로 변환하면 언급 된 오류가 발생합니다. 이것은 셀에 공백이나 정수 값으로 간주 될 수없는 다른 값이 들어있는 경우에도 발생합니다. 칼럼을 읽을 때 좀 더주의 깊은 접근이 필요합니다.

또한 Linq는 많은 작업에 훌륭하지만 때로는 큰 그림을 보지 않고 사용하면 성능이 저하 될 수 있다는 점을 고려해야합니다. 현재 코드에서 격자 행 위에 세 개의 루프가 있습니다. 하나는 명시 적이고 두 개는 linq 구문에 숨겨져 있으며 세 개의 루프는 모두 동일한 셀 값을 읽습니다.
성능에 대해 이야기하기 전에 먼저 측정해야하지만 정상적인 for 루프를 사용하면 코드가 더 빠르다고 말하는 것이 안전하다고 생각합니다.

double minSpeed = double.MaxValue; 
double maxSpeed = 0.0; 
double sumSpeed = 0.0; 
for(int x = 0; x < dataGridView1.Rows.Count; x++) 
{ 
    double value; 

    // If TryParse cannot convert the input it returns false and this 
    // code will simply skip the row and continue with the next one. 
    // Of course you can code an else condition and display an error 
    // message referencing the invalid line (x) 
    if(double.TryParse(dataGridView1.Rows[x].Cells[2].Value.ToString(), out value)) 
    { 
     if(value < minSpeed) minSpeed = value; 
     if(value > maxSpeed) maxSpeed = value; 
     sumSpeed += value; 
    } 
} 
double averageSpeed = sumSpeed/dataGridView1.Rows.Count; 

저는 gridview에서 잘못된 입력을 피하기 위해 double.TryParse를 사용했습니다.
셀 내용이 로캘 설정에 따라 서식이 지정되면 잘못된 형식 오류가 제거됩니다.

+0

이 오류를 시도했지만 다른 오류가 발생합니다. 단어 셀에는 빨간색 밑줄이 그어져 있습니다. 오류 \t CS1061 \t 'DataGridViewRowCollection'에 'Cells'에 대한 정의가없고 확장 메서드가 없습니다 'DataGridViewRowCollection'유형의 첫 번째 인수를 허용하는 '셀'을 찾을 수 있습니다 (사용 지시문이나 어셈블리 참조가 누락 되었습니까?) – 786

+0

죄송합니다, 복사 붙여 넣기 오류가 수정됩니다 – Steve

+0

나는 이것을 시도했지만 다른 오류가 발생했습니다 그것은 항상 같은 줄을 것 : if (double.TryParse (dataGridView1.Rows [x] .Cells [2] .Value, out 값))와 오류는 다음과 같습니다 심각도 \t 코드 \t 설명 \t 프로젝트 \t 파일 \t 라인 \t 억제 상태 오류 \t CS1503 \t 인수 1 : '문자열'에 '객체'에서 변환 할 수 없습니다 – 786

관련 문제