如何基于公共属性过滤列表(只有这样才能找到最小值)

问题描述 投票:0回答:2

问题描述:

我有一个Manufacturers列表的场景,每个场景都包含IdCapacityCodePrice。我想找到最便宜的价格,但仅针对所有制造商都具有相同CapacityCode的商品。

class Manufacturer
{ 
    int Id { get; set; } 
    string CapacityCode { get; set; }
    decimal Price { get; set; }
}

我的目标:

用具有相同容量代码的项目过滤列表,然后找到最低价格。

例如:

{
    "Manufacturers": [
    {
        "Id": 1,
        "CapacityCode": "Foo",
        "Price": 15
    },
    {
        "Id": 1,
        "CapacityCode": "Boo", // Manufacture 2 has no "Boo" so it should be filtered
        "Price": 10
    },
    {
        "Id": 2,
        "CapacityCode": "Foo",
        "Price": 30
    },
    {
        "Id": 2,
        "CapacityCode": "Zoo", // Manufacture 1 has no "Zoo" so it should be filtered
        "Price": 20
    }
}

过滤列表的输出应为:

{
    {
        "Id": 1,
        "CapacityCode": "Foo",
        "Price": 15
    },
    {
        "Id": 2,
        "CapacityCode": "Foo",
        "Price": 30
    }
}

因此,最低价格应为15。

我尝试过:

要按CapacityCode分组并找到最大分组数(在示例中,“ Foo”的计数为2,而“ Boo”和“ Zoo”的计数为1,因此最大值为2)。再次按CapacityCode对列表进行分组,并检查其组计数是否等于最大组计数,然后用AddRange将组添加到结果列表中。做一个简单的最小长度。

我的问题:

如何在性能和可读性上实现相同的结果,(通过两次更好的列表分组方法)

c# performance linq .net-core ienumerable
2个回答
1
投票

IIUC您的问题,无需将Manufacturer列表分组两次。您可以按CapacityCode进行分组,然后找到最大计数,然后按最大计数过滤分组。然后使用SelectMany获取商品,最后通过Price


0
投票

您可以按CapacityCodeToLookup将制造商分组,用ToLookup得到最大计数,用Max过滤最大计数的组,用Max将组展平到Where,然后排序Where的价格。

© www.soinside.com 2019 - 2024. All rights reserved.