我会试着解释一下。 假设我在列表中有多个项目:
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());
答案 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)
您可以按products
对variant
进行分组,然后选择每个组中的最后一项:
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();