簡體   English   中英

Linq選擇分組列表的最后一項

[英]Linq to pick out last item of grouped list

我將盡力解釋這一點。 假設我在列表中有多個項目:

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

您可以GroupBy的“變種”屬性,並保持各組的最后一個:

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

所以,因為我正在使用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());

我相信與我上面的方法相同。

您可以按variantproducts進行分組,然后在每個組中選擇最后一項:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM