我有以下列表(简化):
Name | Brand
Shirt0 | Adidas
Shirt1 | Nike
Shirt2 | Adidas
Shirt3 | Adidas
Shirt4 | Erima
Shirt5 | Nike
我想通过品牌订购,并按顺序显示(最多)两个品牌。
因此我不会先展示所有3款阿迪达斯产品,只会展示两款产品!
结果:
Shirt0 | Adidas
Shirt2 | Adidas
Shirt1 | Nike
Shirt5 | Nike
Shirt4 | Erima
Shirt3 | Adidas
所以它需要来自每个品牌的两种产品,并在没有更多产品时重新开始。
如何使用LINQ实现这一目标?
答案 0 :(得分:2)
使用创意here,您可以将每个品牌的商品分组到索引中,然后按索引和品牌排序,然后加入到单个列表中:
var results = products.GroupBy(p => p.Brand)
.SelectMany(pg => pg.Select((p, index) => new { Value = p, Index = index/2 }))
.OrderBy(a => a.Index).ThenBy(a => a.Value.Brand)
.Select(g => g.Value);
答案 1 :(得分:1)
我假设您的Product
类具有以下属性:
public String Brand { get; }
我会使用以下方法:
Brand
属性Order
属性的匿名类中的每个组中,如果分组中的索引小于2,则将其分配为0;如果是其他,则将其指定为1(将适用于第一个和第二个项目)< / LI>
Order
属性应用订单
以下查询:
var result = list
.GroupBy(x => x.Brand)
.SelectMany(g => g.Select((x, i) => new { Order = i < 2 ? 0 : 1, Product = x }))
.OrderBy(x => x.Order)
.Select(x => x.Product)
.ToList();
我想可能会有一个更好的方法,但这个方法很直接。