Linq挑出分组列表的最后一项

时间:2018-03-16 17:52:39

标签: c# linq

我会试着解释一下。 假设我在列表中有多个项目:

var products = new List<JObject>();
products.Add(JObject.Parse("{ colour: 'Pinks', importance: 100, variant: '0' }"));
products.Add(JObject.Parse("{ colour: 'Blacks', importance: 200, variant: '0' }"));
products.Add(JObject.Parse("{ colour: 'Purples', importance: 150, variant: '0' }"));
products.Add(JObject.Parse("{ colour: 'Pinks', importance: 100, variant: '1' }"));
products.Add(JObject.Parse("{ colour: 'Yellows', importance: 200, variant: '1' }"));
products.Add(JObject.Parse("{ colour: 'Oranges', importance: 500, variant: '1' }"));
products.Add(JObject.Parse("{ colour: 'Blues', importance: 100, variant: '2' }"));
products.Add(JObject.Parse("{ colour: 'Pinks', importance: 400, variant: '2' }"));
products.Add(JObject.Parse("{ colour: 'Greys', importance: 120, variant: '2' }"));
products.Add(JObject.Parse("{ colour: 'Pinks', importance: 100, variant: '2' }"));

现在我想获得列表中每个变体的最后一个产品。 在这种情况下,它将是:

products.Add(JObject.Parse("{ colour: 'Purples', importance: 150, variant: '0' }"));
products.Add(JObject.Parse("{ colour: 'Oranges', importance: 500, variant: '1' }"));
products.Add(JObject.Parse("{ colour: 'Pinks', importance: 100, variant: '2' }"));

这可以用linq完成吗?

如果没有,可以这样做:

var variant = products[0].SelectToken("variant").ToString();
var productList = new List<JObject>();
var count = products.Count - 1;
for (var i = 0; i < count; i++)
{
    var product = products[i];
    var nextProduct = products[i + 1];
    var productVariant = nextProduct.SelectToken("variant").ToString();
    if (productVariant.Equals(variant)) continue;
    productList.Add(product);
    variant = productVariant;
}
productList.Add(products.Last());

3 个答案:

答案 0 :(得分:1)

您可以GroupBy“变种”属性并保留每个组的最后一个:

var ans = products.GroupBy(p => p.Property("variant").Value).Select(pg => pg.Last()).ToList();

答案 1 :(得分:0)

所以,因为我正在使用List<JObject>();,我必须创建一个AnonymousType,然后进行分组。 我这样做了:

var lastProducts = products
            .Select(m => new
            {
                Colour = m.SelectToken("colour").ToString(),
                Variant = m.SelectToken("variant").ToString(),
                Importance = Convert.ToInt32(m.SelectToken("importance").ToString())
            })
            .GroupBy(m => m.Variant)
            .Select(m => m.Last());

我认为这与我上面的方法相同。

答案 2 :(得分:0)

您可以按productsvariant进行分组,然后选择每个组中的最后一项:

var products = new List<JObject>();
products.Add(JObject.Parse("{ colour: 'Pinks', importance: 100, variant: '0' }"));
products.Add(JObject.Parse("{ colour: 'Blacks', importance: 200, variant: '0' }"));
products.Add(JObject.Parse("{ colour: 'Purples', importance: 150, variant: '0' }"));
products.Add(JObject.Parse("{ colour: 'Pinks', importance: 100, variant: '1' }"));
products.Add(JObject.Parse("{ colour: 'Yellows', importance: 200, variant: '1' }"));
products.Add(JObject.Parse("{ colour: 'Oranges', importance: 500, variant: '1' }"));
products.Add(JObject.Parse("{ colour: 'Blues', importance: 100, variant: '2' }"));
products.Add(JObject.Parse("{ colour: 'Pinks', importance: 400, variant: '2' }"));
products.Add(JObject.Parse("{ colour: 'Greys', importance: 120, variant: '2' }"));
products.Add(JObject.Parse("{ colour: 'Pinks', importance: 100, variant: '2' }"));

var query = from p in products
            group p by p.Property("variant").Value into varGroup
            select varGroup.Last();