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 作为结果。

4

1 回答 1

3

您必须提取具有相同 id (GroupBy) 的组,然后使用 SelectMany 导出每个组的最大 No :

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())
于 2013-05-15T14:11:02.767 回答