LINQ group by list和每个分组属性的第一个/最后一个

时间:2016-09-16 09:45:01

标签: c# linq group-by

我无法弄清楚如何使用LINQ进行此查询。 我有以下示例类:

class Foo
{
    string Identifier {get; set;}
    int StartValue {get; set;}
    int EndValue {get; set;}
}

其中Identifier是唯一标识符,StartValueEndValue是两个整数。

我创建了以下列表

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

我该如何实现这个目标?

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