如何从列表中计算最高数字和最低数字?

时间:2013-09-25 20:46:44

标签: c# winforms

    cpuSensorValues.Add(sensor.Value);
if (cpuSensorValues.Count == 300)
    {
     for (int i = 0; i < cpuSensorValues.Count; i++)
          {

           Logger.Write("The Current CPU Temperature Is ===> " + sensor.Value);
          }
     cpuSensorValues = new List<float?>();
    }

我每秒都会向List cpuSensorValues添加一个值。 然后,当它达到300个值时,我想计算最高数字,最小数字和List中的平均数字将每个数字写入记录器,然后为列表创建一个新实例。

问题是如何计算这3个数字?

1 个答案:

答案 0 :(得分:7)

您可以使用Enumerable.Max()Enumerable.Min()Enumerable.Average()

var min = cpuSensorValues.Min();
var max = cpuSensorValues.Max();
var avg = cpuSensorValues.Average();

但是,这将列出3次列表(每次调用一次)。在实践中,这可能不会成为一个问题,但如果是,你可以自己处理:

// Returns min/max/average, ignoring null elements
Tuple<float,float,float> ComputeStats(IEnumerable<float?> values)
{
     float min = float.MaxValue;
     float max = float.MinValue;
     float total = 0.0;
     int count = 0;

     foreach(var value in values)
     {
        if (value.HasValue)
        {
            min = Math.Min(min, value.Value);
            max = Math.Max(max, value.Value);
            total += value.Value;
            ++count;
        }
     }

     return Tuple.Create(min, max, total / count);
}

鉴于您自己将值添加到列表中 - 您甚至可以随时保持运行总计+最小值和最大值。这将完全避免需要枚举(或甚至存储)值。可以轻松修改上面的代码来处理这个问题,而不必将值存储在List<T>中。