我正在尝试获取包含一对项目的组。
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分钟之内。 在相应的开启之前永远不会出现关闭的情况。
答案 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;
}
}