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个数字?
答案 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>
中。