2011-03-05 59 views
0

第1返回我有一個測量表如下:
的SourceID:整數
時間戳:日期/時間
測量:整數LINQ在重複序列

樣本數據看起來像這樣(更下面的星號):
SID | TimeStamp |測量
10 | 02-01-2011 12:00:00 | 30 *
10 | 02-01-2011 12:10:00 | 30
10 | 02-01-2011 12:17:00 | 32 *
10 | 02-01-2011 12:29:00 | 30 *
10 | 02-01-2011 12:34:00 | 30
10 | 02-01-2011 12:39:00 | 35 *
10 | 02-01-2011 12:46:00 | 36 *
10 | 02-01-2011 12:39:00 | 36
10 | 02-01-2011 12:54:00 | 36
11 | 02-01-2011 12:00:00 | 36 *
11 | 02-01-2011 12:10:00 | 36
11 | 02-01-2011 12:17:00 | 37 *
11 | 02-01-2011 12:29:00 | 38 *
11 | 02-01-2011 12:34:00 | 38
11 | 02-01-2011 12:39:00 | 37 *
11 | 02-01-2011 12:46:00 | 36 *
11 | 02-01-2011 12:39:00 | 36
11 | 02-01-2011 12:54:00 | 36

我需要一個LINQ查詢,當Measurement值與具有相同SourceId的前一行(即每行標有星號)不同時,它將只返回行。該表應按SourceId,然後TimeStamp排序。

來自查詢的數據將用於繪製一個圖,其中每個SourceId是一系列圖。源表有幾百萬行,重複測量的數量是幾千。由於這些重複的測量值對結果圖沒有任何影響,所以在將數據傳遞給我的圖形控件進行渲染之前,我想消除它們。

我嘗試過以各種方式使用Distinct(),並在此查看了聚合查詢http://msdn.microsoft.com/en-us/vcsharp/aa336746,但沒有看到明顯的解決方案。

+0

順便問一句,「Distinct」有什麼問題?它應該是你需要的,你可以發佈代碼嗎? – Vlad 2011-03-05 23:40:08

+0

@Vlad,看看最後三行。他們有不同的時間價值,但只有第一個是想要的。 – 2011-03-06 13:05:08

回答

0

有時,一個普通的舊foreach循環就足夠了。

var finalList = new List<MyRowObject>(); 
MyRowObject prevRow = null; 

foreach (var row in myCollection) 
{ 
    if (prevRow == null || (row.SID != prevRow.SID || row.Measurement != prevRow.Measurement)) 
    { 
     finalList.Add(row); 
    } 
    prevRow = row; 
} 
+0

在嘗試了各種解決方案之後,我決定採用一些明智的緩存方式,嘗試真正的循環。 – 2011-03-13 19:43:18

0

就我個人而言,我喜歡包含在Rx擴展庫中的DistinctUntilChanged擴展方法。這非常方便。順便說一下,圖書館的其他部分也是如此。

但我明白,你可能不想爲此添加一個全新的依賴關係。在這種情況下,我建議Zip

 sequence.Take(1).Concat(
     sequence.Zip(sequence.Skip(1), (prev,next) => new { item = next, sameAsPrevious = prev == next }) 
      .Where((x,index) => !x.sameAsPrevious) 
      .Select(x => x.item) 
     ) 
+0

我不認爲Zip()在linq中支持實體 – saus 2011-03-07 06:02:23

+0

@saus:我在原始問題中沒有看到關於實體的任何內容。 – 2011-03-07 06:27:55

+0

是的,你是對的,這是一個LINQ到SQL的問題。它在linq-to-sql中也不被支持 - 但我不認爲這就是你的意思? – saus 2011-03-07 07:06:56

0

在sql中,沒有辦法在單個查詢中執行此操作。 Ergo無法在linq to sql的單個查詢中執行此操作。

問題是你需要比較每一行到「下一個」行。這並不是SQL所能做的。

看前五行:

10 | 02-01-2011 12:00:00 | 30 * 
10 | 02-01-2011 12:10:00 | 30 
10 | 02-01-2011 12:17:00 | 32 * 
10 | 02-01-2011 12:29:00 | 30 * 
10 | 02-01-2011 12:34:00 | 30 

你要保持2個記錄30,並刪除2條記錄與30的規則進行分組。