[英]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());
我相信與我上面的方法相同。
您可以按variant
對products
進行分組,然后在每個組中選擇最后一項:
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.