【问题标题】:How to get maximum Id in List and then return list如何获取列表中的最大 ID,然后返回列表
【发布时间】:2013-05-15 13:23:59
【问题描述】:

我有这样的结构:

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

【问题讨论】:

    标签: linq c#-4.0 group-by max


    【解决方案1】:

    您必须提取相同 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())
    

    【讨论】:

    • items.GroupBy(groupedItems =&gt; groupedItems.Id).Select(g =&gt; g.OrderByDescending(x =&gt; x.No).First())
    • Exact Gert,避免多重匹配。
    • @Gert:这就是我昨天的答案,完全相同。请将此作为答案发布,以便我标记它。
    • @oinant:感谢您回答这个问题,因为这个问题在我脑海中盘旋了好几个月。
    • @ItiTyagi 将其添加到 oinant 的答案中。毕竟,他做了所有的努力。
    猜你喜欢
    • 2021-03-05
    • 1970-01-01
    • 2019-06-13
    • 2011-04-15
    • 1970-01-01
    • 2011-03-10
    • 1970-01-01
    • 2023-01-30
    相关资源
    最近更新 更多