2013-02-11 62 views
0

早上好,我有兩個列表,我需要合併到一起,並創建一個數據表分組,我有下面的代碼塊:LINQ合併兩個列表,並通過時間戳

private static DataTable GetDataTable(IList<DataValue> listOneDataValues, 
              IList<DataValue> listTwoDataValues) 
     { 
     var dataTable = new DataTable(); 
     dataTable.Columns.Add("ColumnFromListOne"); 
     dataTable.Columns.Add("ColumnFromListTwo"); 
     dataTable.Columns.Add("TimeStamp"); 

     //Group the lists together 
     var query = (from listOne in listOneDataValues 
         from listTwo in listTwoDataValues 
         let columnFromListOne= listOne.DoubleValue 
         let columnFromListTwo= listTwo.DoubleValue 
         let timestamp = listOne.TimeStamp 
         where listOne.TimeStamp == listTwo.TimeStamp 
         select new {ColumnFromListTwo = columnFromListOne, ColumnFromListOne = columnFromListTwo, Timestamp = timestamp}); 


     foreach(var q in query) 
      dataTable.Rows.Add(q.ColumnFromListOne, q.ColumnFromListTwo, q.TimeStamp); 

     return dataTable; 
     } 

問題是這兩個列表包含時間戳,它們在幾秒鐘內關閉,並且它們根本不對齊,因此,即使每個列表包含200多條記錄,我的最終結果也會以數據表中的一條或零條記錄結束。我對LINQ非常不滿,並希望得到一個正確的方向。我想我需要在分組之前插入時間戳,但我想知道做這種事情的最佳實踐模式。

+0

你想怎麼處理那幾秒都關閉時間戳?他們*不同,所以他們應該被視爲不同。你可以舍入或舍入到最接近的分鐘,但是如果時間戳跨越那條線呢?你可以找到他們之間的距離,但如果你有很多事件,你會得到重疊。 – Bobson 2013-02-11 16:14:25

+0

粒度的最低級別是每5分鐘一次。我想要四捨五入到最接近的5分鐘。 – Gallen 2013-02-11 16:16:45

回答

2

您需要確定一個合適的閾值是什麼調用兩個時間戳「相等」 - 知道太大的閾值會給您帶來誤報,而太小的閾值會阻止某些記錄加入。

從那裏只是改變你的查詢

 int threshold = 5; 
    //Group the lists together 
    var query = (from listOne in listOneDataValues 
        from listTwo in listTwoDataValues 
        where Math.Abs(
            (listOne.TimeStamp - listTwo.TimeStamp) 
            .TotalSeconds 
           ) <= threshold 
        select new { 
           ColumnFromListTwo = listTwo.DoubleValue, 
           ColumnFromListOne = listOne.DoubleValue, 
           Timestamp = listOne.TimeStamp 
          }); 
+0

這兩個都是很好的答案,儘管它會讓你完整。 – Gallen 2013-03-25 16:45:03

4

你可以改變你where聲明

where Math.Abs((listOne.TimeStamp - listTwo.TimeStamp).TotalSeconds) < 5

這會考慮不同的5秒兩次爲「相同的」

+1

我會在這裏避免幻數。創建一個epsilon或閾值變量,並確保根據數據進行一些測試以確定合適的值。不同的也可能以毫秒爲單位,而不是秒。 – Servy 2013-02-11 16:35:14