【问题标题】:Average value of list列表的平均值
【发布时间】:2016-09-24 17:37:08
【问题描述】:

我想编写将在第一次单击时启动 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”类型的未处理异常

附加信息:序列不包含任何元素

【问题讨论】:

  • 你遇到了什么错误?
  • 这可能是因为您试图在第一次单击后获得一个没有任何元素的列表的Average。你遇到了什么异常?
  • @pavnik System.Core.dll 中发生“System.InvalidOperationException”类型的未处理异常附加信息:序列不包含任何元素
  • 最后两行用 if (list.Count > 1) 换行

标签: c# list stopwatch


【解决方案1】:

您的list 是空的,因此调用Average() 会引发异常。更改以下行

double average = list.Average();

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

【讨论】:

  • 为什么是0.0?您认为可以默默地使用零吗?另一种选择是list.Count &gt; 0 ? list.Average() : double.NaN。空序列的平均值在某种意义上可以说是0.0 / 0.0
【解决方案2】:
if (list.Count > 0)
{
    textBox2.Text = list.Average().ToString();
}

【讨论】:

  • 计数应大于等于 1。
  • 为什么?平均 1 个元素没有任何意义。 LE:除非那是它需要在文本框中显示的内容。在这种情况下,我想你是对的:)
  • 如果您的列表计数为 1,则不会填充文本框。
【解决方案3】:
if (list.Count > 1)
{
    double average = list.Average();
    textBox2.Text = average.ToString();
    rotorSpeed.Stop();
}

这很好用。谢谢!

【讨论】:

    猜你喜欢
    • 2016-06-14
    • 2017-03-15
    • 2012-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    相关资源
    最近更新 更多