You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用LINQ实现分组计数后的重复次数统计?

LINQ实现计数的重复次数统计

假设你的数据实体类定义如下:

public class Record
{
    public string Name { get; set; }
    public string Value { get; set; }
}

先初始化测试数据:

var records = new List<Record>
{
    new Record { Name = "A", Value = "Sample1" },
    new Record { Name = "A", Value = "Sample2" },
    new Record { Name = "A", Value = "Sample3" },
    new Record { Name = "B", Value = "Sample3" },
    new Record { Name = "B", Value = "Sample1" },
    new Record { Name = "C", Value = "Sample2" },
    new Record { Name = "C", Value = "Sample3" },
    new Record { Name = "D", Value = "Sample1" }
};

核心LINQ查询(分步分组,直观简洁)

var result = records
    // 第一步:按Name分组,统计每个Name的记录数
    .GroupBy(r => r.Name)
    .Select(g => new { Count = g.Count() })
    // 第二步:按统计得到的Count分组,统计每个Count的重复次数
    .GroupBy(x => x.Count)
    .Select(g => new 
    { 
        Count = g.Key, 
        NumberOfTimes = g.Count() 
    })
    .ToList();

逻辑说明

  1. 第一部分GroupBy(r => r.Name).Select(g => new { Count = g.Count()})对应你提供的SQL中GROUP BY Name, COUNT(*)的逻辑,生成每个Name对应的计数集合(即中间结果的Name | count)。
  2. 第二部分GroupBy(x => x.Count).Select(...)将第一步得到的计数再次分组,以Count为键,统计每个键出现的次数,最终得到你需要的count | numberOfTimes结果。

可选:模拟SQL窗口函数的写法

如果你想贴近原SQL的窗口函数逻辑,也可以用GroupJoin实现(但不如分步分组直观):

var resultWithWindow = records
    .GroupBy(r => r.Name)
    .Select(g => new { Count = g.Count() })
    .GroupJoin(
        records.GroupBy(r => r.Name).Select(g => g.Count()),
        x => x.Count,
        y => y,
        (x, y) => new { Count = x.Count, NumberOfTimes = y.Count() }
    )
    .Distinct()
    .ToList();

输出结果

遍历result即可查看最终数据:

foreach (var item in result)
{
    Console.WriteLine($"Count: {item.Count}, NumberOfTimes: {item.NumberOfTimes}");
}

输出内容:

Count: 3, NumberOfTimes: 1
Count: 2, NumberOfTimes: 2
Count: 1, NumberOfTimes: 1

内容的提问来源于stack exchange,提问作者SharmaPattar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 16:30:57