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

时间:2018-04-13 13:24:56

标签: 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 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
}]");

我希望这是有道理的。

2 个答案:

答案 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));