如何获取相应值更改的行值 - LINQ

时间:2014-11-14 12:39:16

标签: c# wpf 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

现在,我只是做一个select distinct,以获得不同的限制并将它们添加到列表中,如下所示:

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

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

任何帮助?

3 个答案:

答案 0 :(得分:1)

这里的诀窍是使用GroupBy而不是Distinct。然后,您可以获得每个限制对的最小时间戳:

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

答案 1 :(得分: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

答案 2 :(得分: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();