按值排序的列表,具有最大序列外观

时间:2014-10-28 09:00:14

标签: c# .net linq

我有以下列表(简化):

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实现这一目标?

2 个答案:

答案 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; }

我会使用以下方法:

  1. Brand属性
  2. 对产品进行分组
  3. 将结果包装在具有附加Order属性的匿名类中的每个组中,如果分组中的索引小于2,则将其分配为0;如果是其他,则将其指定为1(将适用于第一个和第二个项目)< / LI>
  4. 根据我们的匿名类
  5. Order属性应用订单
  6. 选择产品,以便摆脱我们的匿名包装类
  7. 以下查询:

    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();
    

    我想可能会有一个更好的方法,但这个方法很直接。