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