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的答案中。毕竟,他做了所有的艰苦工作。