2014-04-12 128 views
0

我試圖讓這個小窗口窗體應用程序,讓你點擊一個按鈕,它會計算你每秒點擊多少。但是,我收到不想要的結果。獲得一個列表的平均值

標籤總是爲0或1.我的工作是使用Stopwatch類作爲計時器。

 public List<long> clickTimes = new List<long>(); 

    Stopwatch stopwatch = new Stopwatch(); 

    long last = 0; 

    private void startCalc() 
    { 
     stopwatch.Start(); 
    } 

    private void stopCalc() 
    { 
     stopwatch.Stop(); 
    } 

    private void resetCalc() 
    { 
     stopwatch.Reset(); 
    } 

    private long time() 
    { 
     return stopwatch.ElapsedMilliseconds; 
    } 

    private bool isOn() 
    { 
     return stopwatch.IsRunning; 
    } 

    private long frequencyFromInterval(long ms) 
    { 
     return 1000/ms; 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     if (isOn() == false) 
     { 
      startCalc(); 
     } 
     last = time() - last; 
     clickTimes.Add(last); 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     long avg = 0; 

     for (int i = 0; i < clickTimes.Count; i++) 
     { 
      avg = avg + clickTimes[i]; 
     } 
     avg = avg/clickTimes.Count; 
     avg = frequencyFromInterval(avg); 
     label1.Text = "Avg. CpS: " + avg.ToString()); 
    } 
+0

'return 1000L/ms;' – Damith

+0

從簡單的設計角度來看,您可以使用Rx快速實現此目的。 – Aron

+0

@Damith長整數仍然會在小數點後的部分數字下降。 –

回答

1

你peroblem是divide操作。它自動將值舍入爲long,因爲所有操作數的類型都是long,結果是long

private void button2_Click(object sender, EventArgs e) 
{ 
    double sum = 0; 
    for (int i = 0; i < clickTimes.Count; i++) 
    { 
     sum += clickTimes[i]; 
    } 
    double avg = sum/clickTimes.Count; 
    double frequency = FrequencyFromInterval(avg); 
    label1.Text = "Avg. CpS: " + frequency.ToString()); 
} 

private double FrequencyFromInterval(double ms) 
{ 
    return 1000/ms; 
} 

另外在button1_Click方法中有一個小錯誤。當找到last並添加到clickTimes列表中時,您使用不同的值。您應該緩存您通過time方法獲得的值。

long time = time(); 
last = time - last; 
clickTimes.Add(time); 
1

從你的代碼的快速一瞥我想你的問題是由於您使用的值,除以long類型的事實,只能返回一個數字的整數部分。嘗試使用floatdouble類型。

+0

秒錶使用時間很長,我如何將長時間轉換爲浮動? – Elmub

+0

有幾種方法可以做到這一點, long lNumber = ...; float fNumber =(float)lNumber; float fNumber2 = lNumber as float; 或者,如果將其分配給浮點型變量並且該分區中使用的變量之一爲浮點型,則它可以隱式轉換爲浮點型。 –

0

如何只使用Average功能列表上,像這樣

double average = clickTimes.Average();