-1
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<float?> cpuSensorValues每秒钟都在增加一个值。然后,当它达到 300 个值时,我想计算列表中的最高数、最低数和平均数,将每个数字写入记录器,然后在列表中创建一个新实例。

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

4

1 回答 1

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);
}

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

于 2013-09-25T20:49:03.867 回答