2017-03-04 253 views
0

嗨,所以我需要一些幫助找到速度的最小值,最大值和平均值。我已經使用了數據網格視圖並生成了包括速度在內的差異列。當用戶用數字加載文件時,速度轉換爲雙倍,並在表中顯示,例如,之前:299之後:29.9。我想要做的是找到不同速度的平均值,即最小值和最大值。下面是代碼的一小部分,它試圖解決avg min和max的問題​​,但它不起作用並且一直在引發一個錯誤。找到表中數據的最小最大值和平均值

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

_keeps引發一個錯誤。怎麼樣才能分享那個錯誤信息? – Steve

+0

Soryy yes出現的錯誤是:mscorlib.dll中發生類型'System.FormatException'的未處理異常 附加信息:輸入字符串格式不正確。 – 786

+0

額外的信息:我已經宣佈MinSpeed,MaxSpeed和AvgSpeed全部爲整數 – 786

回答

1

如果您的列包含浮點值,如29.9然後使用轉換爲整數結果在提到的錯誤。如果您的單元格包含空格或其他不能被視爲整數的值,也會發生這種情況。閱讀專欄時,您需要更謹慎的方法。

另外,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; 

我已經使用double.TryParse來避免從您的gridview無效輸入。
如果您的單元格內容根據您的語言環境設置進行了格式設置,則這將刪除無效的格式錯誤。

+0

我已經嘗試了這個,但是又出現了一個錯誤:單詞Cells以紅色下劃線。 錯誤\t CS1061 \t'DataGridViewRowCollection'不包含'Cells'的定義並且沒有擴展方法可以找到接受類型'DataGridViewRowCollection'的第一個參數的'Cells'(是否缺少using指令或程序集引用?) – 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

相關問題