2014-11-14 15 views
0

对不起,标题有点含糊,想不到一个好的。如何获取相应值更改的行值 - LINQ

我有一个对象列表,它包含一些最大和最小极限值以及一个时间戳。

为了说明这一点,我的网格用于显示列表的内容可能是这样的(很简单):

LimitMin | LimitMax | Start Time 
1   2  08:00 
1   2  08:01 
1   2  08:03 
2   5  08:05 
2   5  08:06 
2   5  08:10 

现在,我只是做一个选择不同,得到不同的限制和补充他们到一个列表,像这样:

var limitdistinct = printIDSPC.Select(x => new { x.LimitMin, x.LimitMax }).Distinct(); 

但我想获得的时间戳,以及,在限制改变(在本例中08:05以上)。我似乎无法弄清楚,如何做到这一点。我想到了Distinct实际上是如何在幕后工作的,如果你能以某种方式从select语句中获得时间戳。我是否必须通过foreach循环遍历整个列表,然后比较这些值以查看其更改的位置?

任何帮助?

回答

1

这里的技巧是使用而不是鲜明的GroupBy。然后,您既可以得到每个限制对最小时间戳:

items 
    .GroupBy(x => new { x.LimitMin, x.LimitMax }) 
    .Select(x => new { 
     x.Key.LimitMin, 
     x.Key.LimitMax, 
     MinStartTime = x.Min(y => y.StartTime) 
    }); 

,或者作为的GroupBy保留原始项目的顺序,得到每个第一时间标记:

items 
    .GroupBy(x => new { x.LimitMin, x.LimitMax }) 
    .Select(x => new { 
     x.Key.LimitMin, 
     x.Key.LimitMax, 
     FirstStartTime = x.First().StartTime 
    }); 
+0

决定去你的第一个建议,它的作品就像一个魅力。非常感谢! – St0ffer 2014-11-14 13:37:59

0

一种解决方案将是组由最小/最大,然后由起始时间顺序最后选择所述第一时间值:

var list = new List<Foo> 
{ 
    new Foo { LimitMin = 1, LimitMax = 2, StartTime = TimeSpan.Parse("08:00") }, 
    new Foo { LimitMin = 1, LimitMax = 2, StartTime = TimeSpan.Parse("08:01") }, 
    new Foo { LimitMin = 1, LimitMax = 2, StartTime = TimeSpan.Parse("08:03") }, 
    new Foo { LimitMin = 2, LimitMax = 5, StartTime = TimeSpan.Parse("08:05") }, 
    new Foo { LimitMin = 2, LimitMax = 5, StartTime = TimeSpan.Parse("08:06") }, 
    new Foo { LimitMin = 2, LimitMax = 5, StartTime = TimeSpan.Parse("08:10") }, 
}; 

var tmp = list 
    .GroupBy(z => new { z.LimitMin, z.LimitMax }) 
    .Select(z => 
     new 
     { 
      Time = z.OrderBy(z2 => z2.StartTime).First().StartTime, 
      Min = z.Key.LimitMin, 
      Max = z.Key.LimitMax 
     }) 
    .ToList(); 
1

试试这个: -

var limitdistinct = printIDSPC.GroupBy(x => new { x.LimitMax, x.LimitMin }) 
             .Select(x => new 
              { 
               LimitMin = x.Key.LimitMin, 
               LimitMax = x.Key.LimitMax, 
               MinTime = x.OrderBy(y => y.StartTime).First().StartTime 
              }); 

Fiddle

相关问题