早上好,我有两个需要合并并创建数据表的列表,我有以下代码块:
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 :(得分:4)
您可以将where
声明更改为
where Math.Abs((listOne.TimeStamp - listTwo.TimeStamp).TotalSeconds) < 5
这会将两次相差5秒视为“相同”
答案 1 :(得分: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
});