2013-02-11 64 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