如何用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();
逻辑说明
- 第一部分
GroupBy(r => r.Name).Select(g => new { Count = g.Count()})对应你提供的SQL中GROUP BY Name, COUNT(*)的逻辑,生成每个Name对应的计数集合(即中间结果的Name | count)。 - 第二部分
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
相关产品推荐
相关产品推荐

