0

早上好,我有两个列表需要合并在一起并从中创建一个数据表,我有以下代码块:

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 很不满意,希望能在正确的方向上有所帮助。我想我需要在分组之前插入时间戳,但我想知道做这样的事情的最佳实践模式。

4

2 回答 2

4

您可以将您的where声明更改为

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

这会将两次相差 5 秒的时间视为“相同”

于 2013-02-11T16:14:19.870 回答
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
                             });
于 2013-02-11T16:19:07.460 回答