LINQ按列表分组,每个分组属性的第一个/最后一个

本文关键字:第一个 最后一个 属性 列表 LINQ | 更新日期: 2023-09-27 18:07:23

我不知道如何使用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

我应该如何做到这一点?

LINQ按列表分组,每个分组属性的第一个/最后一个

按标识符分组,然后选择第一个开始值和最后一个结束值-几乎与您描述的完全相同

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
                                });
相关文章: