2016-09-16 28 views
0

我無法弄清楚如何使用LINQ進行此查詢。 我有以下示例類: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三個startValue(1)和EndValue中的第一個是三個EndValues中的最後一個4)。

結果列表

"11111" 1 4 
"22222" 1 2 

我應該如何實現這一目標?

回答

4

組由標識符,然後選擇第一個起始值和最後endValue值 - 幾乎完全按照你描述它

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

再次,你可以預測這回你的類,而不是匿名的。

+0

對不起,我的錯。我首先要求最小/最大值,但是我想要編輯前一個/最後一個。非常感謝第一/最後和最大/最小解決方案,他們完美地工作 – Rowandish

1

在這裏你去

IEnumerable<Foo> result = myList.GroupBy(x => x.Identifier) 
           .Select(x => new Foo() { 
            Identifier = x.Key, 
            StartValue = x.First().StartValue, 
            EndValue = x.Last().EndValue 
           }); 
相關問題