[英]LINQ - GroupBy Item and filter based on two Properties
我有項目清單
var itema = new ObjX { Id = 1, MajorV = 1, MinorV = 1 };
var itemb = new ObjX { Id = 1, MajorV = 2, MinorV = 1 };
var itemc = new ObjX { Id = 1, MajorV = 3, MinorV = 0 };
var iteme = new ObjX { Id = 2, MajorV = 2, MinorV = 0 };
var itemf = new ObjX { Id = 2, MajorV = 2, MinorV = 1 };
我想創建一個linq查詢以返回唯一ids
的列表,這些ids
首先具有最高的MajorV
,然后具有最高的MinorV
在此示例中,要返回的項目為itemc
和itemf
。
我有以下查詢,但未考慮MinorV
var filteredquery = query.GroupBy(cm => new { cm.Id })
.Select(grp => grp.Aggregate((max, cur) =>
(max == null || cur.MajorV > max.MajorV) ? cur : max));
有什么想法嗎?
var filteredquery = query.GroupBy(cm => cm.Id)
.Select(gcm => gcm.OrderByDescending(cm => cm.MajorV).OrderByDescending(cm => cm.MinorV).First());
這給了我您期望的結果:
var result = items.GroupBy(x => x.Id)
.Select(x =>
{
var CriteriaObj = x.OrderByDescending(z => z.MajorV)
.ThenByDescending(z => z.MinorV).First();
return new ObjX
{
Id = x.Key,
MajorV = CriteriaObj.MajorV,
MinorV = CriteriaObj.MinorV
};
}).ToList();
基於Dmitry Bychenko答案和Stefan Steinegger的評論,此查詢最簡單且有效:
var filteredquery = query
.GroupBy(x => x.Id)
.Select(chunk => chunk
.OrderByDescending(item => item.MajorV)
.ThenByDescending(item => item.MinorV)
.First())
.ToList();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.