2013-05-15 15 views
0

我有這樣的結構:如何獲得最大編號的列表,然後返回列表

No ID Name Status 
1 1 A 1 
2 1 B 1 
3 1 c 1 
4 1 D 1 
5 2 E 3 
6 2 F 3 
7 2 G 3 

我想運行一個LINQ當我得到一個列表結果得到最大行,其中的每一個狀態和行的詳細信息如:

No ID Name Status 
4 1 D 1 
7 2 G 3 

表示狀態的最新條目。

是否有解決方法,因爲我試過所有Max,Orderby降序,但我得到單一結果,但我需要一個List作爲結果。

回答

3

你必須提取相同的ID(的GroupBy)的組,然後導出最大號爲一組,用的SelectMany:

public void Exec() 
{ 
    var items = new List<Item>{ 
     new Item{ No = 1, Id = 1, Name = "A", Status = 1} , 
     new Item{ No = 2, Id = 1, Name = "B", Status = 1} , 
     new Item{ No = 3, Id = 1, Name = "C", Status = 1} , 
     new Item{ No = 4, Id = 1, Name = "D", Status = 1} , 
     new Item{ No = 5, Id = 2, Name = "E", Status = 1} , 
     new Item{ No = 6, Id = 2, Name = "F", Status = 1} , 
     new Item{ No = 7, Id = 2, Name = "G", Status = 1} , 

    }; 

    var result = items 
        .GroupBy(groupedItems => groupedItems.Id) 
        .SelectMany(i => items 
             .Where(innerItem => innerItem.Id == i.Key && innerItem.No == i.Max(ii => ii.No)) 
             .Select(innerItem => innerItem)            
             ); 

    foreach (var item in result) 
     Console.WriteLine("Max item of Id {0} : No = {1}, Name = {2}, Status = {3}", item.Id, item.No, item.Name, item.Status); 


} 

private class Item 
{ 
    public Int32 No { get; set; } 
    public Int32 Id { get; set; } 
    public String Name { get; set; } 
    public Int32 Status { get; set; } 
} 

輸出:

Max item of Id 1 : No = 4, Name = D, Status = 1 
Max item of Id 2 : No = 7, Name = G, Status = 1 

替代:

items.GroupBy(groupedItems => groupedItems.Id) 
    .Select(g => g.OrderByDescending(x => x.No).First()) 
+1

或'items.GroupBy(groupedItems => group edItems.Id).Select(g => g.OrderByDescending(x => x.No).First())' –

+1

精確的Gert,避免了多重匹配。 – oinant

+0

@Gert:這就是我昨天所做的,完全一樣的答案。請將此作爲答案發布,以便我可以對其進行標記。 –

相關問題