[英]Linq query to select top records
我有IEnumerable<MyData>
,其中包含以下数据
Fruits | Name | Quantity |
__________________________
Mango | Jay | 10 |
__________________________
Apple | Jay | 16 |
__________________________
Grapes| Jay | 12 |
__________________________
Mango | Raj | 11 |
__________________________
Apple | Raj | 20 |
__________________________
Grapes| Raj | 3 |
__________________________
Mango | Vik | 20 |
__________________________
Apple | Vik | 15 |
__________________________
我需要根据名称从Linq顶部选择两个数量
Jay (10+16+12) = 38
Raj (11+20+3) = 34
Vik (20+15) = 35
Jay和Vik有两个数量之和,所以我需要这些记录
Fruits | Name | Quantity |
__________________________
Mango | Jay | 10 |
__________________________
Apple | Jay | 16 |
__________________________
Grapes| Jay | 12 |
__________________________
Mango | Vik | 20 |
__________________________
Apple | Vik | 15 |
__________________________
听起来像你可能想要的东西:
var query = from item in collection
group item by item.Name into g
orderby g.Sum(x => x.Quantity) descending
select g;
var topTwo = query.Take(2);
这将采用前两组 ,因此您将其用作:
foreach (var group in topTwo)
{
Console.WriteLine("Name: {0}", group.Key);
foreach (var item in group)
{
Console.WriteLine(" {0}: {1}", item.Fruits, item.Quantity);
}
}
像这样的东西会起作用。
private static IEnumerable<MyData> GetTop2Names(IEnumerable<MyData> data)
{
var top2 = data.GroupBy(d => d.Name)
.OrderByDescending(g => g.Sum(d => d.Quantity))
.Take(2)
.Select(g => g.Key);
return data.Where(d => top2.Contains(d.Name));
}
一步步
请尝试以下方法:
var topTwo = myData.GroupBy(d => d.Name).OrderByDescending(g => g.Sum(d => d.Quantity)).TakeWhile((data,index) => index < 2).SelectMany(g => g);
应该是这样的:
IEnumerable<MyData> source = new List<MyData>();
var names = source
.GroupBy(item => item.Name)
.ToDictionary(item => item.Key, item => item.Sum(i => i.Quantity))
.OrderByDescending(item => item.Value)
.Select(item => item.Key)
.Take(2);
var result = source.Where(item => names.Contains(item.Name));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.