如何使用LINQ从List<Program>集合中按Id与字符分组统计数量?
解决LINQ分组统计问题
嘿,我看你这问题出在分组逻辑上啦!原来的SelectMany(x => x.id)完全用错了——SelectMany是用来展平嵌套集合的,但你这里每个Program对象的id是单个值,这么写之后只会得到一堆id的列表,再按id分组只能统计每个id的总数量,当然出不来你要的id+字符的组合统计结果。
你需要把id和对应的字符作为联合分组键,这样才能把同一个id下相同字符的元素归为一组。正确的代码应该是这样的:
// 假设你的Program类里存储字符的属性叫Char,要是实际属性名不一样记得替换哦 var query = programs .GroupBy(p => new { p.id, p.Char }) .Select(g => new { Id = g.Key.id, Char = g.Key.Char, Count = g.Count() });
简单解释下这段代码:
- GroupBy部分:用匿名类型
new { p.id, p.Char }作为分组的依据,这样只有当id和字符都完全相同时,元素才会被分到同一组里。 - Select部分:从每个分组里取出键中的id和字符,再用
g.Count()统计当前组里的元素数量,正好对应你想要的结果结构。
如果要把结果打印成表格样式,还可以加一段遍历代码:
Console.WriteLine("Id Char Count"); foreach (var item in query) { // 用格式化字符串对齐输出,看起来更整齐 Console.WriteLine($"{item.Id,-3} {item.Char,-5} {item.Count}"); }
运行这段代码后,就能得到你预期的输出啦:
Id Char Count 1 R 3 1 S 2 2 S 3 3 K 1
内容的提问来源于stack exchange,提问作者user13350952
相关产品推荐
相关产品推荐

