C# 如何获取相应值发生更改的行值-LINQ
对不起,标题有点模糊,想不出好的 我有一个对象列表,其中包含一些最大和最小限制值以及一个时间戳 举例来说,我用来显示该列表内容的网格可以如下所示(非常简化): 现在,我只需执行一个select distinct,以获取distinct限制并将其添加到列表中,如下所示:C# 如何获取相应值发生更改的行值-LINQ,c#,wpf,linq,C#,Wpf,Linq,对不起,标题有点模糊,想不出好的 我有一个对象列表,其中包含一些最大和最小限制值以及一个时间戳 举例来说,我用来显示该列表内容的网格可以如下所示(非常简化): 现在,我只需执行一个select distinct,以获取distinct限制并将其添加到列表中,如下所示: var limitdistinct = printIDSPC.Select(x => new { x.LimitMin, x.LimitMax }).Distinct(); 但是我也希望得到时间戳,在这里限制发生了变化(在
var limitdistinct = printIDSPC.Select(x => new { x.LimitMin, x.LimitMax }).Distinct();
但是我也希望得到时间戳,在这里限制发生了变化(在上面的例子中是08:05)。我似乎不知道该如何做到这一点。我考虑了Distinct在幕后的实际工作方式,以及您是否可以从select语句中获得时间戳。我是否必须在foreach循环中遍历整个列表,并比较这些值以查看其更改的位置
有什么帮助吗?一种解决方案是按最小值/最大值分组,然后按开始时间排序,最后选择第一个时间值:
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();
var list=新列表
{
新的Foo{LimitMin=1,LimitMax=2,StartTime=TimeSpan.Parse(“08:00”)},
新的Foo{LimitMin=1,LimitMax=2,StartTime=TimeSpan.Parse(“08:01”)},
新的Foo{LimitMin=1,LimitMax=2,StartTime=TimeSpan.Parse(“08:03”)},
新的Foo{LimitMin=2,LimitMax=5,StartTime=TimeSpan.Parse(“08:05”)},
新的Foo{LimitMin=2,LimitMax=5,StartTime=TimeSpan.Parse(“08:06”)},
新的Foo{LimitMin=2,LimitMax=5,StartTime=TimeSpan.Parse(“08:10”)},
};
var tmp=列表
.GroupBy(z=>new{z.LimitMin,z.LimitMax})
.选择(z=>
新的
{
Time=z.OrderBy(z2=>z2.StartTime).First().StartTime,
最小值=z.Key.LimitMin,
Max=z.Key.LimitMax
})
.ToList();
这里的诀窍是使用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
});
试试这个:-
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
});
.决定接受你的第一个建议,这很有魅力。谢谢!
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
});