0

おはようございます。結合してデータ テーブルを作成する必要がある 2 つのリストがあります。次のコード ブロックがあります。

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;
      }

問題は、2 つのリストに数秒ずれているタイムスタンプが含まれており、それらがまったく一致しないため、各リストに 200 以上のレコードが含まれていても、最終結果はデー​​タテーブルに 1 つまたは 0 のレコードになってしまうことです。私はLINQがかなり苦手で、正しい方向へのポイントをいただければ幸いです。グループ化する前にタイムスタンプを補間する必要があると思いますが、このようなことを行うためのベスト プラクティス パターンを知りたいです。

4

2 に答える 2

4

whereステートメントを次のように変更できます

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

これは、5 秒異なる 2 つの時間を「同じ」と見なします。

于 2013-02-11T16:14:19.870 に答える
2

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 に答える