从列表中检索在一个和另一个的特定时间内的对

时间:2015-02-25 20:17:32

标签: c# linq

我正在尝试获取包含一对项目的组。

public enum eState
{
   On,
   Off,
   blah,
}

public class TestA
{
   public DateTime Time {get; set;}
   public eState State {get; set;}
}

如果我有一个TestA项目列表。如果一个项目的状态为On,则它将具有以下Off。 On和Off之间可能还有其他项目。我需要得到一对彼此相距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分钟之内。 在相应的开启之前永远不会出现关闭的情况。

2 个答案:

答案 0 :(得分:2)

如果您不打算对linq(数据库)使用dataprovider表达式,我建议使用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
            };

答案 1 :(得分:1)

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