2013-09-25 67 views
-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?>(); 
    } 

我每秒向列表添加一個cpuSensorValues值。 然後,當它達到300個值時,我想計算最高數字,最低數字和列表中的平均數字將每個數字寫入記錄器,然後爲列表創建一個新實例。如何從列表中計算出最低數字和平均數字?

問題是我該如何計算這3個數字?

+0

'List.Max''List.Min'' List.Average' –

+1

對於上帝的愛,只是**閱讀文檔**。 http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx – tnw

+0

或者只是[Google](https://www.google.com/search?q=c%23+list+max+min+平均&oq = c%23 + list + max + min + average&aqs = chrome..69i57j69i58j69i60l4.4842j0&sourceid = chrome&espvd = 210&es_sm = 93&ie = UTF-8)。標記爲重複。 – tnw

回答

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>中。

+0

最後一點確實是真正的大列表的最佳解決方案。 – tnw

+0

@tnw即使在這種情況下,如果該列表沒有被用於其他任何事情,這通常可能是最好的選擇。 –

+0

毫無疑問,我應該說「*尤其是*大列表」。 – tnw

相關問題