【问题标题】:LINQ Combine Groups and get distinct maximum number of occurancesLINQ 组合组并获得不同的最大出现次数
【发布时间】:2012-08-07 13:30:00
【问题描述】:

我有许多以两个 int 值的形式出现的项目列表,称为 basketId、ProductNameId,它们已被选中并保留。例如 {{1,1} {1,2}, {1,3}} 到某个较高的购物篮Id {{n,2} {n,6}, {n,6},{n,6},{ n,7},{n,8}}。篮子的数量各不相同,每个篮子的条目数也各不相同。

我需要 ProductNameId 和 Max Count 形式的输出,用于显示所有篮子集合中的每个 ID。对于上面显示的两个,这将是: 1,1, 2,1, 3,1, 6,3, 7,1, 8,1

我有以下代码,它可以工作,但它看起来丑陋且冗长,所以我请求一些帮助以提出更好/更简洁的方法 - 也许单个语句可以做到这一点。

// Get all the baskets that have been saved
var baskets = Baskets.Where(x => x.MarketId == 1);

// Group and get count for each product in each basket
var counts = from q1 in all
group q1 by new 
{
    q1.ProductNameId,
    q1.BasketId
}
into g
select new
{
    ProductNameId = g.Key.ProductNameId,
    Count = g.Count ()
};

// Group products and find the Maximum count that exists
var max = from q2 in counts
group q2 by q2.ProductNameId
into g
select new
{
    ProductNameId = g.Key,
    Max = g.Max (x => x.Count)
};

// The distinct set of values present
var distinct = max.Distinct();

【问题讨论】:

  • 您能否进一步澄清您的数据?本质上是List<Basket>,其中篮子有两个整数ProductNameIdBasketId?如果是这样,一些示例数据是什么样的?您想从中得到什么?
  • 所以如果你有这个:{ {1,1}, {1,2}, {1,3}, {1,2}, {1,3}, {2, 2}, {2,3}, {1,4}, {1,5} } 你会期待这样的结果吗? {ProductNameId = 1, Max = 1}, {ProductNameId = 2, Max = 3}, {ProductNameId = 3, Max = 3}, {ProductNameId = 4, Max = 1}, {ProductNameId = 5, Max = 1},
  • Basket 本质上是一个有两列的项目,BasketId(哪个购物篮有内容)和 ProductNameId(购买了什么产品类型)。任何一天都有数百条唯一的 BasketId 记录,对于每个不同的 BasketId 值,通常有 5 到 50 个 ProductNameId 值。当客户购买不止一种相同的产品类型时,其中一些值会出现不止一次。例如,他们可以购买两种不同品牌的谷物或糖果,篮子将包含两条记录
  • eburgos,是的,如果您的示例篮子用作输入,那么输出就是我所期望的。但在我的情况下,有 100 种不同的购物篮,它们都需要同时考虑,每个购物篮都有一组独特且多样化的 productNameId(每个出售的购物篮都有一组不同的产品类型,某些类型的产品可能会出现多次)

标签: linq count grouping distinct


【解决方案1】:

您的底层数据对我来说仍然有点神秘,但从您的代码看起来,我相信您正在尝试这样做:

// Get all the baskets that have been saved  
var baskets = Baskets.Where(x => x.MarketId == 1);  

// Group and get count for each product in each basket 
var distinct = from q1 in baskets 
    group q1 by q1.ProductNameId into g
    select new
    {
        ProductNameId = g.Key,
        Max = (from q2 in g
            group q2.BasketId by q2.BasketId).Max (x => x.Count())
    };

【讨论】:

    【解决方案2】:

    这是一个相当直接的方法:

    var query =
        baskets
            .ToLookup(b => b.ProductNameId)
            .Select(l => new
            {
                ProductNameId = l.Key,
                Max = l.Count(),
            });
    

    【讨论】:

    • 抱歉,这不能正常工作。此处生成的 Max 值实际上包含已处理的所有购物篮中 ProductNameId 的计数。当我在我的样本上运行它时,产生的最大值是 132 个产品名称 ID == 1 的项目,它是所有篮子中 ProductNameId == 1 值的总数。任何一个篮子中存在的 ProductNameId == 1 的实际最大数量是 3。我需要这个值而不是所有篮子中存在的计数。
    猜你喜欢
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-11
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    相关资源
    最近更新 更多