所以,我在JSON中有这个产品列表:
var products = JArray.Parse(@"[{
id: 1,
name: 'Product 1',
variantId: 1
}, {
id: 2,
name: 'Product 2',
variantId: 1
}, {
id: 3,
name: 'Product 3',
variantId: 1
}, {
id: 4,
name: 'Product 4',
variantId: 4
}, {
id: 5,
name: 'Product 5',
variantId: 4
}]");
它作为JObject
的列表被读入我的API。目前我这样做:
var sortedProducts = _sortProvider.SortByDrive(products, questions);
var productsToRemove = new List<JObject>();
var variant = "________NOTHING________";
for (var i = sortedProducts.Count - 1; i >= 0; i--)
{
var product = sortedProducts[i];
var productVariant = product.SelectToken("variant").ToString();
if (productVariant.Equals(variant))
productsToRemove.Add(product);
variant = productVariant;
}
products.RemoveAll(x => productsToRemove.Contains(x));
但我想使用Linq获取产品(删除)。对于上面的代码,您应该看到,基本上我希望它能够获得具有相同variantId但跳过第一个的所有产品。所以在上面的例子中,它应该返回:
var products = JArray.Parse(@"[{
id: 2,
name: 'Product 2',
variantId: 1
}, {
id: 3,
name: 'Product 3',
variantId: 1
}, {
id: 5,
name: 'Product 5',
variantId: 4
}]");
我希望这是有道理的。
答案 0 :(得分:3)
按DisableCallback = true
分组并选择除每个组之外的所有项目(如果需要返回JSON,则用variantId
括起来):
JArray
这对我有用:
new JArray(sortedProducts.GroupBy(p => p["variantId"]).SelectMany(g => g.Skip(1)));
答案 1 :(得分:0)
另一个答案,虽然它通常会起作用,但不能保证有效。 假设组中的第一项始终是&#34; master&#34;项目
但如果父母不是其组中的第一个项目,例如:
,这将会中断var products = JArray.Parse(@"[{
id: 2,
name: 'Product 2', //SWAPPED
variantId: 1
}, {
id: 1,
name: 'Product 1', //SWAPPED
variantId: 1
}, {
id: 3,
name: 'Product 3',
variantId: 1
}, {
id: 4,
name: 'Product 4',
variantId: 4
}, {
id: 5,
name: 'Product 5',
variantId: 4
}]");
为了公平对待@ Stop-Cran ,您明确要求排除&#34;首先&#34;项目。他回答了问题,但我怀疑这是你试图解决的实际问题。
好像你想排除&#34;主人&#34;产品系列的变体,即自己设置为variantId
的产品。
按照这些标准,更有保障的方法是使用该特征(obj.Id == obj.variantId
)来排除它们:
new JArray(sortedProducts.Where(p => p.id != p.variantId));