2014-01-21 23 views
2

創建數據的時間間隔我在C#中的一個問題,我無法弄清楚如何解決:與LINQ

我有一組數據是由一個時間戳和值。 這是一個樣本數據集:

<Timestamp>2014-01-06T17:40:08.000Z</TimeStamp> 
<Value>200</Value> 
<Timestamp>2014-01-06T17:40:09.000Z</TimeStamp> 
<Value>234</Value> 
<Timestamp>2014-01-06T17:40:11.000Z</TimeStamp> 
<Value>214</Value> 
<Timestamp>2014-01-06T17:40:12.000Z</TimeStamp> 
<Value>264</Value> 
<Timestamp>2014-01-06T17:40:13.000Z</TimeStamp> 
<Value>300</Value> 
<Timestamp>2014-01-06T17:40:15.000Z</TimeStamp> 
<Value>276</Value> 

我需要做的是通過每30秒以某種方式得到的平均值。請注意,數據記錄不一定是每秒鐘。這讓我很難想象如何做到這一點,而不會對結果產生不安全感。

這是通過LINQ語句實現的,還是您有其他建議?

+0

考慮使用['Timer'](http://msdn.microsoft.com/ en-us/library/system.timers.timer(v = vs.110).aspx) –

+4

那不是他每'30秒'的意思:) – Alex

+0

這是你的實際XML模式嗎?時間戳和值不在父元素中一起分組? –

回答

2

假設您可以弄清楚如何解析XML,並且您有一個包含TimeValue的對象集合。例如,我將使用這個集合:

var now = DateTime.Now; 
var random = new Random(); 
var times = Enumerable.Range(1, 10000).Select(i => new 
{ 
    Time = now.AddHours(random .NextDouble()), 
    Value = i 
}); 

使用一個輔助方法DateTime RoundUp(DateTime dt, TimeSpan d),並GroupBy

var interval = TimeSpan.FromSeconds(30); 
var intervalAverageValues = 
    times.GroupBy(t => RoundUp(t.Time, interval)) 
     .Select(g => new 
     { 
      AverageValue = g.Average(t => t.Value), 
      IntervalEndTime = g.Key, 
      Count = g.Count() 
     }); 
+0

瑣事 - 由於延遲執行和隨機值,'intervalAverageValues'在每次使用時都有不同的值。 – Kobi

+0

我不會想出我的自我!謝謝! – Sasquatch

0

考慮這個僞答案:)

  1. 把你的價值觀和它們的時間戳列表和產生的Tuple<int, int>{}列表,這是假設你的值是整數。其中第一個int是索引並且第二個int是的值;
  2. 當您填寫元組列表時,您需要獲取時間戳記的總秒數組分,並將其除以30.結果應四捨五入到最接近的int
  3. 在這一點上,你有一個元組列表的值與其對應的'30秒'組索引配對;
  4. 使用一個簡單的組linq來產生你的平均值。基本上你循環你的小組並且總結這些值。然後除以組的項目數;

這是蠻力的方法。我相信有更聰明的方法來做到這一點。