对不起,标题有点模糊,想不出好的。
我有一个对象列表,其中包含一些最大和最小限制值以及时间戳。
为了说明,我用于显示该列表内容的网格可能是这样的(非常简化):
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循环中浏览整个列表,并比较这些值以查看其更改位置?
任何帮助?
答案 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
});
答案 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();