LINQ按列表分组,每个分组属性的第一个/最后一个
本文关键字:第一个 最后一个 属性 列表 LINQ | 更新日期: 2023-09-27 18:07:23
我不知道如何使用LINQ进行此查询。我有下面的例子类:
class Foo
{
string Identifier {get; set;}
int StartValue {get; set;}
int EndValue {get; set;}
}
,其中Identifier
为唯一标识符,StartValue
和EndValue
为两个整数。
我创建了以下列表
List<Foo> myList = new List<Foo>()
myList.Add(new Foo { "11111", 1, 2 })
myList.Add(new Foo { "11111", 2, 3 })
myList.Add(new Foo { "11111", 3, 4 })
myList.Add(new Foo { "22222", 1, 2 })
更清晰的输入列表
"11111" 1 2
"11111" 2 3
"11111" 3 4
"22222" 1 2
我想按标识符分组每个元素,并将第一个StartValue
和最后一个EndValue
关联到它们。
例如,我有三个"11111"元素,所以在我的输出列表中,我希望有一个"11111"元素,StartValue
是三个startValues(1)中的第一个,EndValue
是三个EndValues(4)中的最后一个。
结果列表
"11111" 1 4
"22222" 1 2
我应该如何做到这一点?
按标识符分组,然后选择第一个开始值和最后一个结束值-几乎与您描述的完全相同
var result = myList.GroupBy(x => x.Identifier)
.Select(x => new {
Identifier = x.Key,
FirstStart = x.First().StartValue,
LastEnd = x.Last().EndValue });
如果你更喜欢原始对象而不是匿名对象,你也可以投影回原始对象。
请注意,从你的问题中并不完全清楚你是想要第一个/最后一个还是最小/最大。如果你想要最小最大值,它几乎和上面一样
var result = myList.GroupBy(x => x.Identifier)
.Select(x => new {
Identifier = x.Key,
MinStart = x.Min(y => y.StartValue),
MinEnd = x.Max(y => y.EndValue) });
同样,你可以把它投影回你的类而不是一个匿名的
给你
IEnumerable<Foo> result = myList.GroupBy(x => x.Identifier)
.Select(x => new Foo() {
Identifier = x.Key,
StartValue = x.First().StartValue,
EndValue = x.Last().EndValue
});