列表的平均值

14

我想编写代码,第一次点击会启动 rotorSpeed 秒表,然后在第二次点击时将 rotorSpeed.ElapsedMilliseconds 添加到 list 中。第二次点击将重置秒表并重新开始计时,然后在第三次点击时再次将 rotorSpeed.ElapsedMilliseconds 添加到 list 中。 代码没有错误,但是当我进行调试时,double average = list.Average(); 出现错误。

Stopwatch rotorSpeed = new Stopwatch(); List<double> list = new List<double>();

private void button1_Click(object sender, EventArgs e)
{
    i++;
    //Getting rotor speed
    if (i != 2)
    {               
        if (rotorSpeed.IsRunning)
        {
            rotorSpeed.Stop();
            list.Add(rotorSpeed.ElapsedMilliseconds);
            rotorSpeed.Start();                   
        }
        else
        {
            rotorSpeed.Reset();
            rotorSpeed.Start();
        }
    }

    double average = list.Average();
    textBox2.Text = average.ToString();
}

我遇到了这个错误:

'System.Core.dll' 中发生了未处理的 'System.InvalidOperationException' 类型异常

其他信息: 序列不包含任何元素


你收到了什么错误? - pavnik
4
可能是因为您在第一次点击后尝试计算一个没有元素的列表的“平均值”。您遇到了什么异常? - MarcinJuraszek
1
@pavnik:在 System.Core.dll 中发生了未处理的 System.InvalidOperationException 类型异常。附加信息:序列不包含任何元素。 - rltcounter221
1
将最后两行代码用 if (list.Count > 1) 包裹起来。 - TigOldBitties
3个回答

23

你的list为空,因此调用Average()会抛出异常。 更改以下行:

double average = list.Average();

double average = list.Count > 0 ? list.Average() : 0.0;

6
为什么是 0.0?您认为可以默默地使用零吗?另一个选项是 list.Count > 0 ? list.Average() : double.NaN。在某种意义上,空序列的平均值可以说是 0.0 / 0.0 - Jeppe Stig Nielsen

5
if (list.Count > 0)
{
    textBox2.Text = list.Average().ToString();
}

计数应该大于等于1。 - Vicky_Burnwal
为什么?对一个元素取平均值没有任何意义。除非这是要在文本框中显示的内容。如果是这样,那么我想你是正确的 :) - TigOldBitties
如果您的列表计数为1,则文本框将不会被填充。 - Vicky_Burnwal

1
if (list.Count > 1)
{
    double average = list.Average();
    textBox2.Text = average.ToString();
    rotorSpeed.Stop();
}

这个很好地运作了。谢谢!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接