我无法弄清楚如何使用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
我该如何实现这个目标?
答案 0 :(得分:4)
按标识符分组然后选择第一个起始值和最后一个结束值 - 几乎与描述它完全相同
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) });
再一次,你可以把它投射回你的班级而不是匿名。
答案 1 :(得分:1)
你去吧
IEnumerable<Foo> result = myList.GroupBy(x => x.Identifier)
.Select(x => new Foo() {
Identifier = x.Key,
StartValue = x.First().StartValue,
EndValue = x.Last().EndValue
});