Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# c linq选择除第一个字段外具有相同字段值的项目_C#_Linq - Fatal编程技术网

C# c linq选择除第一个字段外具有相同字段值的项目

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

因此,我有以下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));
我希望这是有意义的。

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

这个列表是你想要删除的项目吗?这个列表是你想要删除的项目吗?显然,产品比我在问题中提出的要复杂得多;在选择过程之前的排序会对产品进行排序,以便主产品始终位于第一位:显然,产品比我提出的问题复杂得多;选择过程之前的排序会订购产品,以便主产品始终位于第一位: