Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq 如何在列表中获取最大Id,然后返回列表_Linq_C# 4.0_Group By_Max - Fatal编程技术网

Linq 如何在列表中获取最大Id,然后返回列表

Linq 如何在列表中获取最大Id,然后返回列表,linq,c#-4.0,group-by,max,Linq,C# 4.0,Group By,Max,我有一个这样的结构: 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

我有一个这样的结构:

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降序,但我得到了一个结果,但我需要一个列表。

您必须提取具有相同id的组(GroupBy),然后导出每个组的Max No,并使用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; }
}

备选方案:

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

您必须提取具有相同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; }
}

备选方案:

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

或者
items.GroupBy(groupedItems=>groupedItems.Id)。选择(g=>g.OrderByDescending(x=>x.No)。First())
Exact-Gert,您的方法可以避免多次匹配。@Gert:这是我昨天得到的答案,完全相同。请将此作为答案发布,以便我可以标记。@Oiant:谢谢你的回答,因为这个问题在我脑海中徘徊了好几个月。@ItiTyagi将其添加到Oiant的答案中。毕竟,他做了所有艰苦的工作。或者
items.GroupBy(groupedItems=>groupedItems.Id)。选择(g=>g.OrderByDescending(x=>x.No)。First())
Exact-Gert,你的方法可以避免多次匹配。@Gert:这是我昨天得到的答案,完全相同。请将此作为答案发布,以便我可以标记。@Oiant:谢谢你的回答,因为这个问题在我脑海中徘徊了好几个月。@ItiTyagi将其添加到Oiant的答案中。毕竟,他做了所有的艰苦工作。