基本问题在于确定现场传感器在其报告的数据中存在间隙的位置。收集所有数据并将其转换为数据库中的表。
所有记录都有一个DateSampleTaken字段,一旦记录按此字段排序,我想知道记录之间的差距(例如)超过15分钟的每个实例。识别出间隙后,将创建包含信息的对象。
我当然可以通过迭代来做到这一点,我只是想知道是否有Linq调用可以解决问题。
答案 0 :(得分:6)
这是一个LINQ表达式,用于获取与下一个样本间隔十五分钟的样本序列:
var gaps = samples.Zip(samples.Skip(1),
(s0, s1) =>
new
{
Sample = s0,
Delta = s1.DateSample - s0.DateSample,
})
.Where(result => result.Delta.TotalMinutes >= 15)
.Select(result => result.Sample);
答案 1 :(得分:1)
假设已经订购了该列表。
var q = list.Select ((value, index) => new {value, index});
var valuesWithGaps =
from a in q
join b in q on a.index + 1 equals b.index
where (b.value.Date - a.value.Date).TotalMinutes > 15
select new {a, b}; /* There is a gap greater than 15 min
* between items a and b
*/
答案 2 :(得分:1)
我的看法:虽未测试过:
int i = 0;
var res = from s1 in _data
orderby s1.DateSampleTaken
select new { row_num = i++, DateSampleTaken = s1.DateSampleTaken };
var res2 = from s1 in res
join s2 in res on s1.row_num equals s2.row_num + 1
where (s2.DateSampleTaken - s1.DateSampleTaken) > 15
select s1.DateSampleTaken;
答案 3 :(得分:0)
This question展示了如何获得单一差距,但我无法想到如何在没有某种循环的情况下获得差距列表...
Here is an article你可以在这里获得一个通用的方法,但是它会使用循环。
抱歉,我无法为您提供一个很酷的LINQ查询,但至少其他人在这个问题上遇到的问题可能会在上面的链接中找到答案。
答案 4 :(得分:0)
我认为您可以使用Select((e, idx) => new { Date = e.DateSampleTaken, Idx = idx})
“索引”重载来获取排序列表中的(日期,idx)对列表。如果你有,你可以用idx2 = idx1 + 1的方式将它与“本身”交叉连接,并选择日期的差异。我发现这很可能会与LINQ 2对象一起使用。但是,我怀疑任何O / RM框架都可以将这些技巧转换为SQL。通常LINQ的表达能力远高于任何O / RM可以转换为SQL的表达能力,但通常只有在您尝试时才会出现这种情况。另一方面,如果数据库服务器允许在SQL中选择行索引,则可以在SQL中解决此问题。
答案 5 :(得分:0)
您可以创建一个自定义枚举器,它遍历任何序列并使用谓词来比较任何对象和下一个对象吗?