C# 从列表中检索在一个和另一个特定时间内的对
我正在尝试获取包含一对项目的组C# 从列表中检索在一个和另一个特定时间内的对,c#,linq,C#,Linq,我正在尝试获取包含一对项目的组 public enum eState { On, Off, blah, } public class TestA { public DateTime Time {get; set;} public eState State {get; set;} } 如果我有一个测试项目列表。如果一个项目的状态是开的,它将有一个后续关闭。开关之间可能有其他项目。我需要一份相隔7分钟的配对列表 例如,如果我的列表如下所示: 1) 5/30/201
public enum eState
{
On,
Off,
blah,
}
public class TestA
{
public DateTime Time {get; set;}
public eState State {get; set;}
}
如果我有一个测试项目列表。如果一个项目的状态是开的,它将有一个后续关闭。开关之间可能有其他项目。我需要一份相隔7分钟的配对列表
例如,如果我的列表如下所示:
1) 5/30/2014 8:30 | blah
2) 5/30/2014 8:32 | On
3) 5/30/2014 8:33 | blah
4) 5/30/2014 8:34 | blah
5) 5/30/2014 8:35 | Off
6) 5/30/2014 8:36 | blah
7) 5/30/2014 8:37 | On
8) 5/30/2014 8:55 | blah
9) 5/30/2014 8:56 | Off
10) 5/30/2014 8:57 | On
11) 5/30/2014 8:58 | Off
12) 5/30/2014 8:59 | blah
它应该返回这些对:
2,5和10,11这两个接通和断开对之间的距离都在7分钟之内。
决不会出现先关后开的情况。如果您不打算对
数据提供程序(数据库)使用linq
表达式,我建议使用for
循环来迭代列表
如果您仍然感兴趣,下面是一个linq
实现:
var query = from x in list
from z in list.Where(y => y.State == eState.Off)
.Where(y => y.Time > x.Time)
.Where(y => y.Time <= x.Time.AddMinutes(7))
.OrderBy(y => y.Time)
.Take(1)
where x.State == eState.On
select new
{
x, z
};
var query=来自列表中的x
从列表中的z开始,其中(y=>y.State==eState.Off)
.其中(y=>y.Time>x.Time)
.其中(y=>y.Time y.Time)
.采取(1)
其中x.State==eState.On
选择新的
{
x、 z
};
TestA lastOn=null;
int lastIndex=-1;
for(int i=0;i
好吧,开始吧,去做吧。听起来简单的列表迭代就可以了;只需跟踪你最后一次看到的是什么时候——当你发现匹配项不匹配时,如果时差为7分钟或更少,则生成一对。过滤不是需要O(n²)时间,而不是简单扫描需要O(n)时间吗?@Douglas最有可能是linq to objects
。但是,如果将其移动到linq to entities
TestA lastOn = null;
int lastIndex = -1;
for (int i = 0; i < tests.Length; i++)
{
switch (test[i].State)
{
case eState.On:
if (lastOn == null)
{
lastOn = test[i];
lastIndex = i;
}
break;
case eState.Off:
if (lastOn != null)
{
if (test[i].Time - lastOn.Time < TimeSpan.FromMinutes(7))
Console.WriteLine(lastIndex + "," + i);
lastOn = null;
}
break;
}
}