C# c linq选择除第一个字段外具有相同字段值的项目
因此,我有以下JSON格式的产品列表:C# c linq选择除第一个字段外具有相同字段值的项目,c#,linq,C#,Linq,因此,我有以下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
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));
我希望这是有意义的。按variantId分组,并从每个组中选择除第一个之外的所有项目,如果需要返回JSON,请用JArray括起来:
new JArray(sortedProducts.GroupBy(p => p["variantId"]).SelectMany(g => g.Skip(1)));
这对我来说意味着:
[{
"id": 2,
"name": "Product 2",
"variantId": 1
},
{
"id": 3,
"name": "Product 3",
"variantId": 1
},
{
"id": 5,
"name": "Product 5",
"variantId": 4
}]
按variantId分组,并从每个组中选择除第一个之外的所有项目,如果需要返回JSON,请用JArray括起来:
new JArray(sortedProducts.GroupBy(p => p["variantId"]).SelectMany(g => g.Skip(1)));
这对我来说意味着:
[{
"id": 2,
"name": "Product 2",
"variantId": 1
},
{
"id": 3,
"name": "Product 3",
"variantId": 1
},
{
"id": 5,
"name": "Product 5",
"variantId": 4
}]
另一个答案虽然通常有效,但并不一定有效。它假定组中的第一个项始终是主项 但如果父项不是其组中的第一个项,则此项将中断,例如:
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,您确实明确要求排除第一项。他回答了被问到的问题,但我怀疑这是你试图解决的实际问题
似乎要排除产品线的主变体,即将自己设置为variantId的产品
根据这些标准,一种更可靠的方法是使用trait obj.Id==obj.variantId来排除它们:
new JArray(sortedProducts.Where(p => p.id != p.variantId));
另一个答案虽然通常有效,但并不一定有效。它假定组中的第一个项始终是主项 但如果父项不是其组中的第一个项,则此项将中断,例如:
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,您确实明确要求排除第一项。他回答了被问到的问题,但我怀疑这是你试图解决的实际问题
似乎要排除产品线的主变体,即将自己设置为variantId的产品
根据这些标准,一种更可靠的方法是使用trait obj.Id==obj.variantId来排除它们:
new JArray(sortedProducts.Where(p => p.id != p.variantId));
这个列表是你想要删除的项目吗?这个列表是你想要删除的项目吗?显然,产品比我在问题中提出的要复杂得多;在选择过程之前的排序会对产品进行排序,以便主产品始终位于第一位:显然,产品比我提出的问题复杂得多;选择过程之前的排序会订购产品,以便主产品始终位于第一位: